我有一个使用Jersey框架创建的rest应用程序,我试图将有状态bean注入我的rest控制器,但这个bean总是再次创建。我通过在打印过去的数据后将测试数据传递到这个bean中来测试这一点,但是sout总是打印null。
@Stateful
public class TestService {
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
@Path("/testController")
public class TestController {
@EJB
private TestService testService;
@Path("/getTest/")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getPage(@QueryParam("TEST")String test) {
System.out.println(testService.getTest());
testService.setTest(test);
}
}
REST代表具象状态转移。"S"代表State not "Stateless"
状态传输:因为REST服务意味着将实体的状态从客户端传输到服务器,反之亦然。
然而,REST组件具有无状态的性质。
它们没有绑定到特定的客户端。但是有状态会话bean被绑定到一个特定的客户端。例如,如果绑定的客户端在一段时间内处于非活动状态,则可以销毁有状态实例。
尝试在无状态组件中注入有状态会话bean。这是不可能的,或者至少是不一致的。
使用CDI时的实践用例(最佳问题):
- 将有状态会话Bean注入到@SessionScoped CDI Bean中。 不要忘记正确设置CDI:最简单的方法是创建
WEB-INFbeans.xml
文件并设置bean-discovery-mode="all"
。不使用CDI的另一个用例:
- 对有状态会话Bean进行JNDI查找,并将返回(代理)保存为HttpSession-Attribute