在有状态EJB中注入无状态EJB不能按预期工作
问题描述:
我试图用(@SessionScoped)在有状态ejb中注入默认(@Dependent)作用域的无状态ejb。在有状态EJB中注入无状态EJB不能按预期工作
StatelessBean.java
@Stateless
@LocalBean
public class StatelessBean implements Serializable {
private static final long serialVersionUID = -9166485686181431397L;
private long stamp; // + getter/setter
public StatelessBean() {
super();
}
@PostConstruct
void init() {
setStamp(new Random().nextLong());
System.out.println("Created stateless " + getStamp());
}
}
StatefulBean.java
@SessionScoped
@Named("bean")
@Stateful
@LocalBean
public class StatefulBean implements Serializable {
private static final long serialVersionUID = 8358897101178976319L;
@Inject
private StatelessBean statelessBean; // + getter/setter
@PostConstruct
void init() {
System.out.println("Created stateful " + new Random().nextLong());
}
public long getStamp() {
return getStatelessBean().getStamp();
}
}
scope.xhtml
.
.
.
<h:body>
<h:outputText value="#{bean.stamp}" />
</h:body>
</html>
正如我理解过程rstand,
- 您不能在无状态bean上指定范围,除了@dependent。
- 如果注入@dependent范围对象,它将遵循客户端生命周期。它永远不会共享。
所以,我期待每一个会话,容器将注入不同的StatelessBean。但它似乎在所有会议中都注入了相同的一个。
任何帮助,为什么发生这种情况?
我正在使用GlassFish 3.1。
谢谢。
答
我认为你的问题是你的无状态bean并不是无状态的。容器可以自由地重用它,因为它应该是无状态的,但是你认为这是一个错误。
@convener感谢您的回复。但我现在认为,这个问题本身可能是无关紧要的。我最近读了(不记得在哪里)CDI是有状态的豆。无状态bean将总是像没有CDI一样运行。我想,应该记住,你只有一种方法调用无状态bean,有或没有CDI。学习到教训了! –