我有一个 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 实例?