Странное поведение при введении EntityManager - PullRequest
0 голосов
/ 23 февраля 2012

Я наблюдал странное поведение при введении EntityManager.

Ниже приведена урезанная версия рабочего кода:

Bean.java

@RequestScoped
@Named
public class Bean {

    @Inject
    private Service service; // +getter

    // few variables + getters/setters

    public String getMessage() {
        return getService().message();
    }

}

Service.java

@Stateless
@LocalBean
public class Service {

    @PersistenceContext
    private EntityManager entityManager; // +getter

    public String message() {
        return "[" + getEntityManager() + "]";
    }

}

cdi.xhtml

<h:body>
    <h:outputText value="#{bean.message}" />
</h:body>

Но мне нужно было кое-что обработать при создании Сервиса . Так добавлен следующий метод производителя, в фабричном классе.

    @Produces
    @QService
    public Service createService() {
        Service service;

        service = new Service();
        // Some processing
        return service;
    }

и добавили тот же квалификатор QService в точке внедрения в классе Боб .

    @Inject
    @QService
    private Service service; // +getter

Теперь EntityManager НЕ внедрен в класс Сервис , он остается нулевым.

Я не могу понять это поведение. Может кто-нибудь объяснить это?

1 Ответ

3 голосов
/ 23 февраля 2012

Мне кажется, проблема в следующей строке:

service = new Service();

Поскольку Service является EJB, его жизненный цикл управляется контейнером.Вам разрешено вызывать new, но я полагаю, вы не получите EJB, а чистый класс Java.

Попробуйте создать EJB-компонент службы вместо создания нового экземпляра.

...