【问题标题】:EJB Stateful bean doesn't have previous stateEJB 有状态 bean 没有先前的状态
【发布时间】:2021-02-06 19:57:17
【问题描述】:

我有一个使用 Jersey 框架创建的 rest 应用程序我正在尝试将 Stateful bean 注入我的 rest 控制器,但这个 bean 总是被再次创建。我已经通过在打印过去的数据后将测试数据传递到这个 bean 来对此进行测试,但总是打印 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);

    }
}

【问题讨论】:

  • 一个有状态的 EJB 与它的客户端一样长。 JAX-RS 资源本质上是请求范围的。但是,很难为xyproblem.info 的实际 X 发布正确的答案,因为您基本上违反了“REST”的“S”部分。 “S”代表“无状态”而不是“有状态”。

标签: jax-rs ejb stateful-session-bean


【解决方案1】:

REST 代表 Representational State Transfer。 “S”代表 State 而不是“Stateless”。

状态传输:因为 REST 服务旨在将实体的状态从客户端传输到服务器,反之亦然。

尽管如此,REST 组件具有无状态特性。

它们不绑定到特定的客户端。但是有状态会话 Bean 绑定到特定的客户端。例如,如果绑定的客户端在一段时间内保持不活动状态,则可以销毁有状态实例。

您尝试在无状态组件中注入有状态会话 bean。这是不可能的,或者至少根本不一致。

使用 CDI 时的实践用例(最佳问题):

  • 在 @SessionScoped CDI Bean 中注入有状态会话 Bean。
  • 不要忘记正确设置 CDI:最简单的方法是创建 \WEB-INF\beans.xml 文件并设置 bean-discovery-mode="all"

不使用 CDI 时的另一个用例:

  • 为有状态会话 Bean 进行 JNDI 查找并将返回(代理)保存为 HttpSession-Attribute

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 2011-06-18
    • 2012-08-09
    • 2017-08-29
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多