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

时间:2016-03-20 10:16:56

标签: java-ee ejb jax-rs stateless-session-bean

我有一个JAX-RS Web服务,其中包含用于生成testdata的资源。在测试期间,我发现注入的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文件包含beans.xml,但没有其他配置文件。所有内容都打包到一个ear文件中,并部署在wildfly 10.0.0.Final中。如果我通过http://localhost:8080/api/test/state将Web服务称为GET请求,我会得到预期的输出:

  

INFO [stdout](默认任务-7)####### VALUE:null
  INFO [stdout](默认任务-7)####### VALUE2:null

但是在第二个请求中,我得到了意想不到的输出:

  

INFO [stdout](默认任务-8)####### VALUE:TestValue
  INFO [stdout](默认任务-8)####### VALUE2:TestValue2

这里有什么问题?野蝇可能有任何错误配置?但我只更改了日志记录和数据源定义。

1 个答案:

答案 0 :(得分:2)

你有@Stateless向后的含义。

这并不是这样的意思:

  

嘿容器,这是一个任意的类,请把它变成无状态的bean。

这实际上就是这样:

  

嘿容器,这里是一个无状态类,你可以放心地将它用作无状态bean。

你有一个有状态的课程。您应该将其标记为@Stateful bean。否则,摆脱所有状态(非托管实例变量),以便您可以安全地将其用作@Stateless bean。

另见: