我有一个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
这里有什么问题?野蝇可能有任何错误配置?但我只更改了日志记录和数据源定义。
答案 0 :(得分:2)
你有@Stateless
向后的含义。
这并不是这样的意思:
嘿容器,这是一个任意的类,请把它变成无状态的bean。
这实际上就是这样:
嘿容器,这里是一个无状态类,你可以放心地将它用作无状态bean。
你有一个有状态的课程。您应该将其标记为@Stateful
bean。否则,摆脱所有状态(非托管实例变量),以便您可以安全地将其用作@Stateless
bean。