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>
Ответы
Ответ 1
Java EE 7 по умолчанию имеет неявные архивы bean, то есть класс bean требует, чтобы аннотатура области видимости была обнаружена как CDI bean.
@Named
не является аннотацией области. Вместо этого попробуйте @Dependent
.
beans.xml
больше не требуется в CDI 1.1/Java EE 7. Если у вас его есть, то точная версия и bean-discovery-mode
имеют значение. См. Раздел Bean архивов в спецификации CDI 1.1.
Поскольку вы не разместили свой beans.xml
, трудно определить, является ли этот файл частью проблемы.
Ответ 2
Поскольку это первый хит, который я нашел в поиске WELD-001408, позвольте мне также упомянуть одну причину - отсутствие конструктора без аргументов. Это, очевидно, было НЕ в случае с ОП, но это было причиной проблемы в моем собственном случае, так что это может помочь и другим.
Ответ 3
Кажется, что архив DAOTest не имеет beans.xml/misplaced beans.xml.
Ответ 4
@LocalBean означает, что вы введете bean, а не интерфейс
@Inject Service service
а не
@Inject ServiceLocal service