CDI: WELD-001408 Неудовлетворительные зависимости, как решить эту проблему?

Я делаю небольшой тестовый проект с CDI. Мое приложение состоит из EJB EAR и WAR, все они развернуты на Glassfish 4. Я использую Hibernate 4.3.4 для доступа к базе данных.

Моя цель - убедиться, что класс в EJB (DAO) может получить инъекцию EntityManager.

Шаблон SessionBean + EJB не является фантастическим, но мне нужно изменить уже созданное приложение, поэтому у меня нет особого выбора.

Вот мой код EJB:

@Named
public class DAOTest implements Serializable {
    private static final long serialVersionUID = 1L;

    @PersistenceContext(unitName="CDI-ejb")
    private EntityManager em;

    public void test(){
        //em.getClass();
    }


    public EntityManager getEm() {
       return em;
    }


    public void setEm(EntityManager em) {
        this.em = em;
    }

    public DAOTest() {
        // TODO Auto-generated constructor stub
    }

}

Service.java

@Stateless
@LocalBean
public class Service implements ServiceLocal {

    @Inject DAOTest test;
    /**
    * Default constructor. 
    */
    public Service() {
        // TODO Auto-generated constructor stub
    }


    @Override
    public void test() {
        test.test();

    }


}

и ServiceLocal.java

@Local
public interface ServiceLocal {
    void test();
}

И внутри моей войны:

@WebServlet("/Test")
public class Test extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Inject private ServiceLocal service;

    /**
    * @see HttpServlet#HttpServlet()
    */
    public Test() {
        super();
        // TODO Auto-generated constructor stub
    }


    /**
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        service.test();
    }


    /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }


 }

Я протестировал DAOTest, добавив к нему аннотацию @ Stateless. Все происходит как надо. Так что CDI работает хорошо. Но с просто @ Named работать не хочет.

Любая идея?

Трассировка стека:

org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [DAOTest] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject test.Service.test]

Мой beans.xml

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>

person Scandinave    schedule 05.03.2014    source источник


Ответы (4)


Java EE 7 по умолчанию имеет неявные архивы bean-компонентов, т.е. классу bean-компонента требуется, чтобы аннотация области была обнаружена как bean-компонент CDI.

@Named не является аннотацией области действия. Попробуйте вместо этого @Dependent.

beans.xml больше не требуется в CDI 1.1 / Java EE 7. Если он у вас есть, то точная версия и bean-discovery-mode имеют значение. См. Раздел Bean-архивы спецификации CDI 1.1.

Поскольку вы не разместили свой beans.xml, трудно сказать, является ли этот файл частью проблемы.

person Harald Wellmann    schedule 05.03.2014
comment
Какая версия CDI встроена в Glassfish 4? - person Scandinave; 05.03.2014
comment
Хорошо, это работает. Как вы сказали, на DAOTest.java отсутствовал тег Scope. Спасибо большое. - person Scandinave; 05.03.2014

Поскольку это первое попадание, которое я получил при поиске WELD-001408, позвольте мне также упомянуть одну причину - отсутствие конструктора без аргументов. Очевидно, это НЕ относилось к OP, но это было причиной проблемы в моем случае, так что это может помочь другим.

person Scott Kurz    schedule 08.09.2015
comment
Все еще актуальный ответ в 2020 году с CDI 2 и Weld 3. Сработал для меня сегодня. - person Bruce Loth; 27.03.2020

@LocalBean означает, что вы будете вводить bean-компонент, а не интерфейс.

@Inject Service service

и не

@Inject ServiceLocal service
person cyril    schedule 12.12.2016

Похоже, что в архиве DAOTest нет beans.xml / misplaced beans.xml.

person covener    schedule 05.03.2014
comment
Я поместил beans.xml в проект META-INF проекта EJB и в проект WEB-INF проекта WAR. DAOTest находится в том же проекте, что и Service.java. Возможно ли, что контейнер, управляющий EntityManager, отличается от контейнера CDI. Итак, CDI не может внедрить EntityManager с @PersistenceContext? - person Scandinave; 05.03.2014