2013-04-28 68 views
0

請與我裸露@Inject在戰爭中,我是新來JEE6 ...NPE與來自JPA實用工具JAR

ENV:JBoss的7.1.1,JDK 1.7,WELD模塊升級到1.1.10(以防萬一)

我有一個JPA項目,我將其添加到WEB-INF \ lib目錄中。它包含實體管理器注入的我的實體和DAO對象。我使用自定義註釋來限定PersistenceContext,它是在Resources類中生成的。我在這個項目中運行了Arquillian測試,以確保它能正常工作。

我在JPA jar的\ META-INF \目錄下和war文件的\ WEB-INF \目錄下有一個beans.xml文件。我甚至把它印出來放在我的桌子上,仍然沒有幫助。

在我的war文件中我有一個類從JPA jar中注入一個DAO對象。它不工作,它的空。

我已經找到了jboss(沒有jpa jar)和CDI的例子,它的工作原理。

我找過的例子,但找不到任何與Jpa罐。任何人都可以指出我有一個jee6 web應用程序的例子,它帶有JPA實用程序jar,它使用註釋將某些東西從JPA jar注入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:12011 INFO [org.quartz.core.JobRunShell](DefaultQuartzScheduler_Worker-2)工作DEFAULT.extractDir扔了JobExecutionException:org.quartz.JobExecutionException:java.lang中.NullPointerException [請參閱nested exception:java.lang.NullPointerException] at com.xyz.asp.commsrv.scheduler.jobs.DirScanJob.execute(DirScanJob.java:149)[classes:] at org。 quartz.core.JobRunShell.run(JobRunShell.java:213)[quartz-2.1.7.jar:] at org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:557)[quartz-2.1.7的.jar:] 引起:在com.xyz.asp.commsrv.scheduler.jobs.DirScanJob.execute(DirScanJob.java:140)顯示java.lang.NullPointerException [類:] ... 2更

這是注入了DAO對象的類。這是由JBoss的的ServletContextListener啓動時啓動石英調度工作:

@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(){ 
    ... 
    } 
} 
+2

你正在描述的應該工作。請發佈堆棧跟蹤。 – 2013-04-28 14:12:52

+0

@John在確認這應該起作用後,我的問題可能在於注射部位。因爲我使用Quartz Scheduler ...我尋找並發現這個堆棧溢出的問題... [http://stackoverflow.com/questions/4812796/can-i-use-cdi-injection-into-quartz- scheduler-jobs]我需要深入挖掘,但希望儘快回覆您。一旦找到具體的東西,我會更新這個 – 2013-04-29 14:25:06

+0

是的,您需要使用SO帖子中提到的quartz 2 cdi集成。 – 2013-04-29 14:36:33

回答

0

CDI是在上下文中了ServletContextListener,但沒有提供Quartz Scheduler。我不想打擾另一個圖書館,因爲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> 

而對於石英作業中的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 { 
    ... 
} 

FYI ... jboss as 7.1將輸出到server.log會話bean的JNDI綁定。