EJB 有状态 Bean 没有先前的状态



我有一个使用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

相关内容

  • 没有找到相关文章

最新更新