私は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>
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
を投稿しなかったため、このファイルが問題の一部であるかどうかを判断するのは困難です。
これはWELD-001408を検索した最初のヒットであるため、引数なしのコンストラクターがないという1つの原因についても言及します。これは明らかにOPの場合ではありませんでしたが、私自身の場合の問題の原因であったため、他の人にも役立つ可能性があります。
DAOTestのアーカイブにはbeans.xmlがなく、beans.xmlが間違っているようです。
@LocalBeanは、インターフェースではなくBeanを注入することを意味します
@Inject Service service
ではなく
@Inject ServiceLocal service