2

我正在寻找我的方案的解决方案或解释。

我有一个抽象类,它有一个我想注入的字段。

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 具体实现。

4

0 回答 0