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



我有一个 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豆子。用于显示奇怪行为的那个定义如下:

@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,但没有其他配置文件。所有内容都打包到一个耳朵文件中,并部署在wildfly 10.0.0.Final中。如果我通过 GET 请求调用网络服务 http://localhost:8080/api/test/state 我会得到预期的输出:

INFO [stdout] (默认任务-7) ####### 值:空
INFO [stdout] (default task-7) ####### VALUE2: null

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

INFO [stdout] (default task-8) ####### 值: 测试值
INFO [stdout] (default task-8) ####### VALUE2: TestValue2

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

你有向后@Stateless的意思。

这并不意味着这样:

嘿容器,这是一个任意类,请使其成为无状态的 bean。

这实际上意味着:

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

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

另请参阅:

  • 为什么是无状态会话 bean?
  • JSF 请求范围的 Bean 在每个请求上不断重新创建新的有状态会话 bean?
  • 使用 @EJB 时,每个受管 Bean 是否都有自己的 @EJB 实例?

最新更新