在有状态EJB中注入无状态EJB不能按预期工作

时间:2011-12-13 08:31:22

标签: java-ee-6 cdi

我正在尝试使用默认(@Dependent)范围注入一个无状态ejb,在一个有状态的ejb中使用(@SessionScoped)。

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>

据我了解,

  1. 您无法在无状态bean上指定范围,除了@dependent。
  2. 如果注入@dependent范围对象,它将遵循客户端生命周期。永远不会分享。
  3. 所以,我希望对于每个会话,容器都会注入不同的StatelessBean。但它似乎在所有会议中注入相同的一个。

    有关为何发生这种情况的任何帮助?

    我正在使用GlassFish 3.1。

    感谢。

1 个答案:

答案 0 :(得分:0)

我认为你的问题是你的无状态bean并非真正的无状态。容器可以自由重复使用,因为它应该是无状态的,但你将其解释为错误。