2013-07-09 2 views
5

Недавно я перенес простой проект Java EE 6 в Java EE 7. В деталях это означает, что я просто изменил зависимость от javax:javaee-api:6.0 до javax:javaee-api:7.0 и развернул ее до Glassfish 4 вместо Glassfish 3.CDI не работает после перехода на Java EE 7

Впоследствии приложение больше не работало, потому что CDI не смог ввести аннотированные зависимости.

ответ

6

Проблема была в том, что я не знал, что deployment descriptor, а также поведение по умолчанию для поиска зависимостей изменилось в Java EE 7.

Новый deployment descriptor (beans.xml) должен выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.1" bean-discovery-mode="all" > 
</beans> 

Немаловажным является атрибутом bean-discovery-mode, который определяет, как CDI находит всю зависимость. Установив его на bean-discovery-mode="all", CDI ведет себя как в Java EE 6.

2

Установка bean-discovery-mode="all" работает, но также может быть установлена ​​на "annotated" в зависимости от того, как настроены ваши компоненты.

Или вы можете полностью устранить beans.xml, чтобы создать неявный архив. См. Java EE 7 Tutorial section on packaging CDI applications. Чтобы использовать неявные архивы, вам нужно аннотацию, определяющую область видимости для ваших компонентов.

2

Чтобы избавиться от файла beans.xml и сделать инъекции работать на Glassfish 4, вы должны изменить пакеты из областей, а также:

javax.faces.bean.ApplicationScoped -> javax.enterprise.context.ApplicationScoped 
javax.faces.bean.RequestScoped -> javax.enterprise.context.RequestScoped 
javax.faces.bean.SessionScoped -> javax.enterprise.context.SessionScoped 
javax.faces.bean.ViewScoped -> javax.faces.view.ViewScoped 
Смежные вопросы