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