2012-02-23 3 views
0

Я наблюдал странное поведение в отношении инъекции EntityManager.Странное поведение при инъекции 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; 
    } 

и добавил же самый Классификатор Кью-сервис в точке инжекции в классе компонентов-.

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

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

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

+0

Какой выход? Вы уверены, что нулевой объект - это PersitenceContext, а не служба? – perissf

+0

@perissf Выход: ** [null] ** отображается в браузере. В принципе, это вывод метода ** message() ** класса ** Service **. –

ответ

3

Я думаю, что проблема эта линия:

service = new Service(); 

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

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

+0

Да, вы абсолютно правы. Я ввел ** Service ** в заводской класс и вернул это вместо ** new Service(); **. И теперь он работает по мере необходимости. Интересно, будут ли результаты одинаковыми, если ** Сервис ** был ** НЕ ** EJB. Нужно попробовать! Большое спасибо. –

+0

проблема есть ** NOT ** по причине ** Service ** являющийся EJB. То же самое происходит, даже если я беру два POJO вместо ** Service ** и ** EntityManager **. Итак, вывод: «*** Инъекция работает только в том случае, если объект управляется контейнером ***. Это, вероятно, по спецификации, но не достаточно ясно для меня. Таким образом, вместо использования 'service = new Service();', необходимо использовать 'public Service createService (@New Service service)'. –

Смежные вопросы