我正在创建需要有状态的REST Web服务。请考虑以下情况:
我正在尝试通过@Stateful
会话bean执行此操作,但它仍然像@Stateless
一样。现在我想知道它是否可能,因为客户端不接受任何Cookie,因此服务器无法识别它。
是否可以通过REST接收有状态bean?
代码示例:
@Path("/similarity/")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Stateful
@StatefulTimeout(600000) // 10 minutes
public class SimilarityResource {
private List<SimilarityResult> savedSimilarityResults = new ArrayList<SimilarityResult>();
@POST
@Path("/atom-count/")
public List<SimilarityResult> atomCountSimilarity(JAXBElement<SimilarityRequestXML> sr) {
try {
if (this.savedSimilarityResults.isEmpty()) {
List<SimilarityResult> similarityResults = acs.findAllSimilar(); // Time consuming
this.savedSimilarityResults = similarityResults; // Save results
return similarityResults;
} else {
CompoundResponse cr = new CompoundResponse("Hureeey stateful bean works!.", 404);
throw new WebApplicationException(cr.buildResponse());
}
} catch (CompoundSearchException e) {
CompoundResponse cr = new CompoundResponse(500, e);
throw new WebApplicationException(cr.buildResponse());
}
}
}
我的期望是,当我将此/atom-count/
方法调用两次时,它应该以404响应。
答案 0 :(得分:6)
您应该使用@SessionScoped
注释您的资源类,以告知JAX-RS创建具有会话生存期的请求对象,否则默认为@RequestScoped
。