我需要了解在REST中处理异步操作的方法以及它们的优点和缺点.我找到的一些方法:
基于资源:将操作的状态建模为状态.用户进行异步REST调用(PUT,POST等)获取Accepted
或In-Progress
响应(202
).此外,通过GET重复轮询状态URI以检查来自操作执行的状态/进度/消息.
问题:此资源在Server上应该有多长时间处于活动状态?如果客户端在操作完成之间的大间隔轮询中,我们如何返回状态?似乎坚持执行状态会起作用.但是,存档/删除的时间有多长,这种标准方法是什么?
基于回调:需要异步请求才能拥有回调URI.异步处理请求,完成后调用带有操作状态/结果的回调URI.
问题:这似乎更优雅,服务器端的开销更少.但是如何处理回调服务器间歇性关闭,没有响应等情况?实现回调URI提供重试配置的典型重试?这种方法还有其他缺点吗?
Servlet 3.0异步支持: HTTP客户端与Java Servlet建立连接的位置,该Java Servlet在显式关闭之前保持打开状态,直到关闭的客户端和服务器可以通过它进行异步通信.
问题:自从它的Servlet 3.0规范以来,我认为Jersey,即Spring REST实现,目前还没有使用这种方法.是否有任何特定的REST实现,它使用类似的方法或指针来实现它的可能性?
任何其他方法,也许是商业方法?
我需要在基于Jersey的REST服务器上实现CORS支持.我已经阅读了一些可用的材料和信息丰富的教程.我发现人们正在使用两种方法:
方法-1:
简单直接的方法,实现一个HTTP
过滤器,CORS
为响应添加标头(特定于Jersey)
public class ResponseCorsFilter implements ContainerResponseFilter {
public ContainerResponse filter(ContainerRequest req, ContainerResponse contResp) {
ResponseBuilder resp = Response.fromResponse(contResp.getResponse());
resp.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
String reqHead = req.getHeaderValue("Access-Control-Request-Headers");
if(null != reqHead && !reqHead.equals(null)){
resp.header("Access-Control-Allow-Headers", reqHead);
}
contResp.setResponse(resp.build());
return contResp;
}
}
Run Code Online (Sandbox Code Playgroud)
方法-2:
根据其规范完全实现CORS,即预检请求处理和所有标头支持.检查了一个这样的开源java实现cors-filter的源代码
我的问题是应该采取何种方法?方法-1与方法-2的不利之处是什么?
我的用例是所有原点/方法都可以被允许,Authorization
HTTP头将成为所有REST
请求的一部分.我倾向于接近-1,因为看起来大多数默认的CORS设置都足以满足我的用例,但不确定如果没有在服务器端实现完整的CORS规范会产生任何问题.
我有一个用例,其中使用带有排除信息的JSONView注释似乎更合适,例如:
@JSONView(Views.Report1.class, include=false)
Run Code Online (Sandbox Code Playgroud)
这不是杰克逊(1.9.2)直接支持的(包括属性),因为我想知道杰克逊是否有一个简单的解决方法来实现这一目标.
使用案例:
id, name, info1, info2, info3, info4
属性id, name, info1, info2, info4
属性private int id; private String name; private String info1; private String info2; //ignore if view=report2 @JsonView(ReportViews.Report2.class , include=false) private String info3; private String info4;
我的用例是根据视图(或者说report-ids)排除属性.使用JSONView方法,我需要将所有视图添加到除Report2之外的info3属性以将其排除.不合适.
在这种情况下,正确的方法应该是什么?定制JSONView除了排除/包含将是正确的解决方案,如果没有类似的已经可用.
在我的场景中,我有一个模式生成脚本来创建表和所需的索引.我想知道是否有必要@Index
在hibernate实体中定义注释,如果是这样,为什么呢?
脚本:
create table issues (id, project_id, .., status_id)
create index idx_issues_projid on issues (project_id)
Run Code Online (Sandbox Code Playgroud)
实体:
@Table(name="issues")
public class DBIssue {
..
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PROJECT_ID")
@Index(name="INDEX_TFW_ISSUE_PROJECT_ID")
private DBProject project;
}
Run Code Online (Sandbox Code Playgroud)
Hibernate配置:
<property name="hibernate.hbm2ddl.auto">off</property>