web-dev-qa-db-ja.com

CDI:WELD-001408依存関係が満たされていない、解決方法は?

私はCDIで小さなテストプロジェクトを行います。私のアプリケーションはEJB EARとWARで構成され、すべてGlassfish 4にデプロイされています。Hibernate4.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>
19
Scandinave

Java EE 7には、デフォルトで暗黙的なBeanアーカイブがあります。つまり、Beanクラスには、CDI Beanとして検出されるスコープアノテーションが必要です。

@Namedはスコープ注釈ではありません。代わりに@Dependentを試してください。

beans.xmlはCDI 1.1/Java EE 7では不要になりました。ある場合は、正確なバージョンとbean-discovery-modeが違いを生じます。 CDI 1.1仕様の Beanアーカイブ セクションを参照してください。

beans.xmlを投稿しなかったため、このファイルが問題の一部であるかどうかを判断するのは困難です。

14
Harald Wellmann

これはWELD-001408を検索した最初のヒットであるため、引数なしのコンストラクターがないという1つの原因についても言及します。これは明らかにOPの場合ではありませんでしたが、私自身の場合の問題の原因であったため、他の人にも役立つ可能性があります。

7
Scott Kurz

DAOTestのアーカイブにはbeans.xmlがなく、beans.xmlが間違っているようです。

0
covener

@LocalBeanは、インターフェースではなくBeanを注入することを意味します

@Inject Service service

ではなく

@Inject ServiceLocal service
0
cyril