代码之家  ›  专栏  ›  技术社区  ›  Georg Leber

@注入无状态EJB包含来自先前请求的数据

  •  0
  • Georg Leber  · 技术社区  · 10 年前

    我有一个JAX-RS Web服务,其中包含用于生成测试数据的资源。在测试期间,我发现,注入的EJB没有重新初始化,仍然包含来自上一个请求的数据。

    我有一个jar文件 server.jar 包含我的EJB业务逻辑。为了显示我的问题,我创建了一个无状态bean:

    @Stateless
    public class TestService
    {
        @EJB
        SubsequentTestService state2Service;
    
        private String value;
    
        public void testIt()
        {
            System.out.println("####### VALUE: " + value);
            value = "TestValue";
    
            state2Service.testIt();
        }
    }
    

    我正在使用后续呼叫 SubsequentTestService 以显示调用另一个无状态EJB时也存在奇怪的行为:

    @Stateless
    public class SubsequentTestService
    {
        private String value;
    
        public void testIt()
        {
            System.out.println("####### VALUE2: " + value);
            value = "TestValue2";
        }
    }
    

    更改注释形式 @EJB 到 @Inject 不会改变任何东西。

    在我的 web.war 我有简单的JAX-RS bean。被调用以显示奇怪行为的定义如下:

    @Path("/test")
    public class TestResource
    {
        @Inject
        TestService testService;
    
        @GET
        @Path("/state")
        public void testState()
        {
            testService.testIt();
        }
    }
    

    JAX-RS应用程序配置如下所示:

    @ApplicationPath("/api")
    public class JaxRsConfiguration extends Application
    {
    }
    

    war文件包含bean。xml,但没有其他配置文件。所有内容都打包到一个ear文件中,并在wildfly 10.0.0.Final中部署。如果我通过GET请求调用Web服务 http://localhost:8080/api/test/state 我得到了预期的输出:

    INFO[stdout](默认任务-7)#####值:null
    INFO[stdout](默认任务-7)#####值2:null

    但在第二个请求中,我得到了以下意外输出:

    信息[stdout](默认任务-8)#####值:测试值
    信息[stdout](默认任务-8)#####值2:测试值2

    我的问题是什么?在苍蝇身上可能有什么错误的配置?但我只更改了日志记录和数据源定义。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    你的意思是 @Stateless 向后

    这并不意味着这样:

    嘿,容器,这是一个任意类,请将其设置为无状态bean。

    这实际上意味着:

    嘿,容器,这是一个无状态类,您可以安全地将其用作无状态bean。

    你有一个有状态的类。您应该将其标记为 @Stateful 豆否则,请删除所有状态(非托管实例变量),以便可以安全地将其用作 @无状态的 豆

    另请参见: