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

@Inject stateless EJB contains data from previous request

我有一个 JAX-RS 网络服务,其中包含用于生成测试数据的资源。在测试期间我发现,注入的 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 作为 GET 请求调用网络服务,我会得到预期的输出:

INFO [stdout] (default task-7) ####### VALUE: null
INFO [stdout] (default task-7) ####### VALUE2: null

但是在第二次请求时,我得到了以下意外输出:

INFO [stdout] (default task-8) ####### VALUE: TestValue
INFO [stdout] (default task-8) ####### VALUE2: TestValue2

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

你有@Stateless倒过来的意思

这不是这样的意思:

Hey container, here's an arbitrary class, please make it a stateless bean.

这实际上是这样的意思:

Hey container, here's a stateless class, you can safely use it as a stateless bean.

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

另请参阅:

  • Why Stateless session beans?
  • JSF request scoped bean keeps recreating new Stateful session beans on every request?
  • When using @EJB, does each managed bean get its own @EJB instance?