虽然HTTP 1.1规范似乎允许DELETE请求上的消息体,但它似乎表明服务器应该忽略它,因为它没有定义的语义.
4.3消息正文
服务器应该在任何请求上读取和转发消息体; 如果请求方法不包含实体主体的定义语义,那么在处理请求时应该忽略消息主体.
我已经回顾了有关SO及其他内容的几个相关讨论,例如:
大多数讨论似乎都同意允许在DELETE上提供消息体,但通常不建议这样做.
此外,我注意到各种HTTP客户端库中的趋势,这些库中似乎记录了越来越多的增强功能,以支持DELETE上的请求主体.大多数图书馆似乎都有责任,尽管偶尔会有一些初步阻力.
我的用例要求在DELETE上添加一些必需的元数据(例如删除的"原因",以及删除所需的一些其他元数据).我已经考虑了以下选项,其中任何一个看起来都不合适,并且与HTTP规范和/或REST最佳实践内联:
POST /resourceToDelete { deletemetadata })POST不是删除的语义选项; POST实际上代表了所需的相反操作(即POST创建资源下属;但我需要删除资源)我的第一个偏好可能是使用消息体,第二个是自定义HTTP头; 但是,如上所述,这些方法存在一些缺点.
是否有任何与REST/HTTP标准一致的建议或最佳实践,以便在DELETE请求中包含此类必需的元数据?还有其他我没有考虑的替代方案吗?
我正在开发一个(Java)项目,其中我有许多附加了源jar文件的jar.
有没有办法让eclipse"文件搜索"搜索包含这些源jar中的一些字符串文字的Java文件(以及txt,xml等),而不仅仅是在项目文件夹中?
或者是否有任何插件可以实现这一目标?
有没有办法使用JaCoCo和tomcat7-maven-plugin嵌入式实例获取代码覆盖?
jacoco-maven-plugin在我的WAR POM中配置来检测我的单元测试,但我不确定如何将jacoco代理连接到嵌入式Tomcat实例来检测针对Tomcat运行的集成测试.鉴于嵌入了Tomcat实例,我不确定这种方法是否可行.有没有其他方法可以实现这一目标?我可以从使用Tomcat Maven插件切换到使用Cargo获取覆盖范围,但如果可能的话,我宁愿坚持使用Tomcat插件.
以下是我POM的一些相关摘要:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.2.201302030002</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.14</version>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<systemProperties>
<!-- as expected, this system property doesn't work since Tomcat is embedded, but this is the type of config I'm looking for -->
<JAVA_OPTS>-javaagent:${project.build.directory}/${jacoco.jar}=destfile=${project.build.directory}/jacoco.exec,append=true</JAVA_OPTS>
</systemProperties>
</configuration>
<executions>
<execution>
<id>tomcat-startup</id>
<goals>
<goal>run-war-only</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
<fork>true</fork>
</configuration>
</execution>
<execution>
<id>tomcat-shutdown</id>
<goals> …Run Code Online (Sandbox Code Playgroud) 如果在应用程序初始化期间发生异常,是否有任何方法可以阻止Java EE应用程序启动?我基本上正在寻找一种方法,使应用程序在应用程序初始化期间从一个或一个bean 抛出一个未处理的异常后进入一个" j2ee.state.failed"状态(按照JSR-77).ServletContextListenerSingleton Startup
该EJB规范似乎表明,如果在初始化过程中发生了异常Singleton的bean,应用程序将继续启动和运行没有错误; 但是,只有bean本身可能处于无法调用的状态.不幸的是,这不是我正在寻找的行为.
4.8.4单例错误处理
在Singleton初始化期间发生的错误被认为是致命的,必须导致丢弃Singleton实例.可能的初始化错误包括注入失败,从
PostConstruct方法抛出的系统异常,或PostConstruct方法容器管理的事务成功提交失败.如果单例无法初始化,则对Singleton的尝试调用会导致第3.4.3节和第3.4.4节中定义的异常.
该Servlet规范是它的要求更加模糊了一下,貌似不是需要一个容器中,任何特定的行为方式,而只是提示(通过使用术语"可能"),该网络模块继续启动,但任何请求应导致内部服务器错误.再说一次,遗憾的是这不是我正在寻找的行为.如果Web应用程序无法处理任何请求,为什么应该继续启动并且似乎正在运行?
11.6听众例外
容器可以使用HTTP状态代码500响应对Web应用程序的所有后续请求以指示应用程序错误.
根据我的经验,我看到应用程序服务器以不同的方式处理此要求.实际上,某些容器会阻止应用程序在这些情况下启动,而其他容器只会抑制异常并响应具有500个错误的请求,如规范中所述.
如果在初始化期间发生异常,我是否会忽略规范中阻止应用程序启动的任何部分?
有没有办法定义一个Spring数据规范(返回JPA谓词),其唯一目的是执行急切提取?
我有一个使用延迟加载定义各种关系的实体,但有几个查询我想要返回整个实体表示,包括所有相关集合,但这些查询的标准可能会有所不同.我已经看过一些帖子(例如在春季论坛上)讨论了fetch组的潜在引入,这可能是理想的解决方案; 但是,由于这还不是JPA规范的一部分,因此Spring Data不提供支持.
我正在寻找一种可重用的方法来对各种动态查询执行热切的提取.
例如,我考虑开发一种可重复使用的规范,其唯一目的是执行预先加载,并且可以与其他规范结合使用,例如:
private static Specification<MyEntity> eager() {
return new Specification<MyEntity>() {
@Override
public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
for (PluralAttribute<? super MyEntity, ?, ?> fetch : root.getModel().getPluralAttributes()) {
root.fetch(fetch, JoinType.LEFT);
}
query.distinct(true);
return null;
}
};
}
Run Code Online (Sandbox Code Playgroud)
此规范的目标是在各种查询中重用它,例如:
repository.findAll(where(eager()).and(otherCriteria).or(otherCriteria));
Run Code Online (Sandbox Code Playgroud)
但是,急切的获取规范并不是真正的谓词,因此它会返回null,并且NullPointerExceptions在与其他谓词链接时会引起明显的问题(即).
(请注意,单独使用此谓词可以按预期工作;即,以下查询将正确获取:)repository.findAll(eager());.
是否存在可以从"渴望"规范返回的适当的非null谓词,或者是否有任何其他可重用的方法可以使用Spring Data JPA规范触发急切的提取(无需将急切的负载添加到另一个规范上)?
在使用Spring Data JPA和Hibernate的Web应用程序中,我们利用Web分页功能在各种实体列表中提供分页和排序功能.
@Controller
public class MyEntityController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView list(Pageable pageable) { ... }
}
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurationSupport {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(new PageableArgumentResolver());
}
}
public interface MyEntityRepository extends PagingAndSortingRepository<MyEntity, String> {
Page<MyEntity> findByPropertyX(String propertyX, Pageable pagable);
}
Run Code Online (Sandbox Code Playgroud)
这允许在呈现的html中将实体属性定义为特殊的排序请求参数,其中该page.sort值实际匹配要排序的实体中的属性.
<table>
<thead>
<tr>
<th><a href="?page.sort=propertyX&page.sort.dir=asc">Property X</a></th>
<th><a href="?page.sort=propertyY&page.sort.dir=asc">Property Y</a></th>
</tr>
</thead>
<tbody>...</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
这会产生一个结果URL,例如:
http://host/context-root/entities/?page.sort=propertyX&page.sort.dir=asc
Run Code Online (Sandbox Code Playgroud)
问题是用户可能会修改URL以使用无效page.sort属性来引用不存在的列/属性名称,或者更糟糕的是,使用无效的JPA查询字符导致语法无效.
例如,如果修改URL以对"noSuchProperty"进行排序:
http://host/context-root/entities/?page.sort=noSuchProperty&page.sort.dir=asc
Run Code Online (Sandbox Code Playgroud)
但是此属性不存在,将抛出以下异常:
java.lang.IllegalArgumentException: No …Run Code Online (Sandbox Code Playgroud) 我想找到适当的状态代码返回,这是我到目前为止的想法:
GET /api/documents/1 - 文件存在,用户有权访问 - 200 OKGET /api/documents/2 - 文档存在,用户无权访问 - 403禁止访问GET /api/documents/3 - 文件不存在(无法检查是否有访问权限) - 404 Not Found?403禁止?GET /api/documents/a - id无效(应该是一个数字) - 400 Bad Request?404找不到?403禁止?我的后端(使用MongoDB)目前的问题是,我做的第一件事是检查用户是否可以通过检查文档ID来查看他有权访问的文档ID列表.如果在列表中找不到document_id,则会自动返回403 Forbidden.这有助于我避免首先从数据库中获取文档以查看用户是否可以访问它.
我不确定这里最好的做法是什么 - 我应该追求更好的HTTP状态代码(从而创建额外的数据库请求),还是最后2个案例(3和4)的403 Forbidden工作?
有什么办法来启动的AWS数据库迁移服务 full-load-and-cdc通过复制任务Terraform?优选地,这将在任务创建时自动开始。
AWS DMS控制台提供了“ 创建时启动任务 ”的选项,AWS CLI提供了start-replication-task命令,但是我在Terraform资源中看不到类似的选项。该aws_dms_replication_task提供的cdc_start_time说法,但我认为这可能仅适用于cdc任务。我已经尝试使用full-load-and-cdc复制任务将此参数设置为多个过去/当前/将来的时间戳记,但是该任务从未启动(它只是创建并进入ready状态)。
如果不支持此功能,我很乐意将功能请求记录到Terraform,但想先与社区联系,看看我是否忽略了今天执行此功能的现有方法。
(注意:该问题也已记录到Terraform Google小组中。)
我想更改一个已经存在的视图。Liquibase 中没有像 \changeView 或 \alterView 这样的东西吗?
我已经用 createView 创建了一个视图。我尝试使用谷歌搜索alterview或changeview,但没有任何正确的结果。