我正在寻找我的方案的解决方案或解释。
我有一个抽象类,它有一个我想注入的字段。
public abstract class AbstractBean<T extends IModelBean> implements IBean<T> {
@Inject
private IDAO<T> dao;
@Override
public List<T> getAll() {
return dao.selectAll();
}
}
具体实现之一是这个 ManagedBean:
@ManagedBean
@RequestScope
public class PersonBean extends AbstractBean<Person> {}
所以我希望 CDI 注入这个 IDAO 实现。
@Named
@SessionScoped
public class PersonDAO extends AbstractDAO<Person> implements Serializable {
@Override
public List<Person> selectAll(){
...
}
}
我从这个 Facelet 页面打来电话
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>JSF and CDI with abstract class</title>
</h:head>
<h:body>
<h:dataTable value="#{peopleBean.all}" var="person">
<h:column >
<h:outputText value="#{person.name}"/>
</h:column>
<h:column >
<h:outputText value="#{person.position}"/>
</h:column>
</h:dataTable>
</h:body>
</html>
它确实可以编译,但是当 Weld 尝试注入dao
对象时,GlassFish 会给我以下消息。
org.jboss.weld.exceptions.IllegalArgumentException: WELD-001408 Unsatisfied dependencies for type [IDAO<IModelBean>] with qualifiers [@Default] at injection point [[BackedAnnotatedField] @Inject private br.personal.mateusduboli.cdi.abstract_class.beans.implementation.AbstractBean.abstractDAO]
at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:82)
at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:68)
at org.jboss.weld.manager.BeanManagerImpl.createInjectionTarget(BeanManagerImpl.java:1039)
at org.glassfish.weld.services.JCDIServiceImpl.injectManagedObject(JCDIServiceImpl.java:283)
at org.glassfish.faces.integration.GlassFishInjectionProvider.inject(GlassFishInjectionProvider.java:189)
at com.sun.faces.mgbean.BeanBuilder.injectResources(BeanBuilder.java:203)
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:101)
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409)
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:244)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:116)
我设法通过将字段放在子类上来使其工作,但这并不能解决我的问题。
我想知道是否有任何解决方案或解释为什么它不起作用。
谢谢。
编辑:添加了具体实现和调用该方法的 facelet 页面。EDIT2:添加了 IDAO 具体实现。