Внедрение EJB без состояния в Stateful EJB не работает должным образом - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь внедрить ejb без состояния с областью по умолчанию (@Dependent), в 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-компонента без состояния, кроме @ зависимого.
  2. Если вы внедрите объект @-зависимой области действия, он следует жизненному циклу клиента.Он никогда не передается.

Итак, я ожидаю, что для каждого сеанса контейнер будет вводить разные StatelessBean.Но, похоже, он вводит один и тот же во всех сеансах.

Любая помощь в том, почему это происходит?

Я использую GlassFish 3.1.

Спасибо.

1 Ответ

0 голосов
/ 02 февраля 2012

Я думаю, что ваша проблема в том, что ваш бин без гражданства не является на самом деле без гражданства. Контейнер может использовать его повторно, поскольку он должен быть без сохранения состояния, но вы интерпретируете это как ошибку.

...