0

env: JBoss 7.1.1、jdk 1.7、1.1.10 にアップグレードされた WELD モジュール (念のため)

WEB-INF\lib ディレクトリに追加する JPA プロジェクトがあります。これには、Entity Manager が挿入したエンティティと DAO オブジェクトが含まれています。リソース クラスで生成される PersistenceContext を修飾するために、カスタム アノテーションを使用しています。このプロジェクトで Arquillian テストを実行して、動作することを確認しました。

JPA jar の \META-INF\ ディレクトリと war ファイルの \WEB-INF\ ディレクトリに beans.xml ファイルがあります。私はそれを印刷して机の上に置きましたが、それでも役に立ちませんでした。

war ファイル内に、JPA jar から DAO オブジェクトを注入するクラスがあります。機能していません。null です。

CDIを使用したjboss(jpa jarなし)の例を見つけましたが、動作します。

例を探しましたが、jpa jar では見つかりません。注釈を使用して JPA jar から war クラスに何かを注入する、JPA ユーティリティ jar を使用した jee6 Web アプリの例がある場所を教えてもらえますか?

この嘆願書をお読みいただき、誠にありがとうございます。

- - - - - - - - - - 追加情報 - - - - - - - - -

warファイルの構造

META-INF
->maven
-->com.xyz
--->web
---->pom.properties
---->pom.xml
->MANIFEST.MF
WEB-INF
->classes
->lib
-->entities.jar
->beans.xml
->faces-config.xml
->web.xml

スタック トレース: 22:23:12,011 INFO [org.quartz.core.JobRunShell] (DefaultQuartzScheduler_Worker-2) ジョブ DEFAULT.extractDir が JobExecutionException をスローしました: org.quartz.JobExecutionException: java.lang.NullPointerException [ネストされた例外を参照してください: java. lang.NullPointerException] com.xyz.asp.commsrv.scheduler.jobs.DirScanJob.execute(DirScanJob.java:149) [クラス:] org.quartz.core.JobRunShell.run(JobRunShell.java:213) [quartz -2.1.7.jar:] org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) で [quartz-2.1.7.jar:] 原因: com.xyz での java.lang.NullPointerException。 asp.commsrv.scheduler.jobs.DirScanJob.execute(DirScanJob.java:140) [classes:] ... 2 つ以上

これは、DAO オブジェクトが注入されたクラスです。これは、jboss の起動時に ServletContextListener によって開始される Quartz スケジューラ ジョブです。

@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class DirScanJob implements Job{
    ...
    @Inject
    FiletracksentHome ftsHome;


    @Override
    public void execute(JobExecutionContext context) throw JobExecutionException{
        ...
        BigDecimal bd = ftsHome.nextId()
    }
}

このクラスはentities.jarにあります:

@Stateless
public class FiletracksentHome{

    @Inject
    @DatabaseEntities
    private EntityManager entityManager;

    public BigDecimal nextId(){
    ...
    }
}
4

1 に答える 1

0

CDI は ServletContextListener で使用できますが、Quartz スケジューラのコンテキスト内では使用できません。CDI は不要だったので、別のライブラリに煩わされたくありませんでした。ServletContextListener 実装内で @Resource アノテーションを使用して、必要ないくつかのプロパティを注入しました ...

@Resource(lookup = "java:app/env/quartzjobdirectory")
private String quartzJobDirectory;

そしてweb.xml内...

<env-entry>
   <description>Quartz Jobs Directory</description>
   <env-entry-name>java:app/env/quartzjobdirectory</env-entry-name>
   <env-entry-type>java.lang.String</env-entry-type>
   <env-entry-value>/appl/jboss-as-7.1.1.Final/standalone/configuration/quartz_jobs/</env-entry-value>
</env-entry>

また、Quartz ジョブ内の EJB 呼び出しについては、DI が使用できないため、次のような JNDI 呼び出しを行いました。

InitialContext ic = new InitialContext();
readyDocs = (ReadyDocumentsLocal) ic.lookup("java:global/commsrv-ear-1.0.0/commsrv-ejb-1.0.0/ReadyDocumentsBean!com.ista.asp.commsrv.ReadyDocumentsLocal");

そしてEJB ...

@Stateless
public class ReadyDocumentsBean implements ReadyDocumentsLocal {
   ...
}

参考までに... jboss as 7.1 は、セッション Bean の JNDI バインディングを server.log に出力します。

于 2013-05-01T03:42:57.713 に答える