2011-02-17 66 views
2

我正在嘗試使用@PersistenceContex註釋將PersistenceContex注入到POJO中,我讀過我需要使POJO能夠做到這一點。所以我注入我的POJO類成servlet(所以它現在管理的依賴對象,對嗎?),但是當servlet正在試圖從注入的對象調用梅託德我得到錯誤:如何將@PersistenceContext注入pojo類

java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName null

所以看起來PersistenceContext是沒有正確注入POJO,我應該怎麼做才能使其工作?

我的POJO類看起來是這樣的:

public class FileEntityControlerImpl implements FileEntityInterface { 

@PersistenceContext 
EntityManager entityManager; 

@Override 
public void createFile(FileEntity fileEntity) { 
    ...} 

@Override 
public FileEntity retriveFile(String fileName) { 
    ...} 

注射點:

@Inject 
FileEntityInterface fileController; 

如果我使用SLSB和使用@EJB注入它工作正常。

.. ::更新:: ..

堆棧跟蹤:

WARNING: StandardWrapperValve[ResourcesServlet]: PWC1406: Servlet.service() for servlet ResourcesServlet threw exception java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MambaPU at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:121) at com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:162) at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:554) at pl.zawi.mamba.core.integration.controllers.implementation.FileEntityControlerImpl.retriveFile(FileEntityControlerImpl.java:32) at pl.zawi.mamba.core.face.servlets.ResourcesServlet.doGet(ResourcesServlet.java:60) at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:662)

persistance.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="MambaPU" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>jdbc/MambaDB</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <shared-cache-mode>ALL</shared-cache-mode> 
     <properties> 
<!--   <property name="javax.persistence.jdbc.password" value="root"/>--> 
<!--   <property name="javax.persistence.jdbc.user" value="root"/>--> 
<!--   <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>--> 
<!--   <property name="eclipselink.ddl-generation" value="create-tables"/>--> 
<!--   <property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>--> 
      <property name="eclipselink.logging.level" value="ALL"/> 
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

.. :: UPDATE2 :: ..

如果有人對我的項目感興趣,那麼我一直在使用maven,所以它應該很容易構建和運行。(MySql驅動器不包括DED在POM-S所以記住它)

Mamba.Core

回答

1
  • 第一,你的POJO需要在一個bean存檔(有META-INFWEB-INFbeans.xml以管理
  • @PersistenceContext需要META-INF/persistence.xml,在那裏你定義一個持久單元
  • 如果有一個持久的單位,它仍然失敗,請嘗試@PersistenceContext(unitName="name")
+0

beans.xml存在於我的ear文件的所有模塊中,但沒有什麼特別的,並且persistence.xml也存在。我已經嘗試添加unitName和name,但是錯誤被盜取相同:( – zawisza017 2011-02-17 14:03:52

+0

@ zawisza017你可以給整個堆棧跟蹤 – Bozho 2011-02-17 14:10:34

2

只爲參考:

你不使用@所有實體類上的PersistenceContext註釋。簡單地包括一個持久化單元與POJO將使它們得到管理(在POJO類的JAR的META-INF文件夾中添加一個persistence.xml和一個空的beans.xml。

@PersistenceContext用於Session Beans和其目的是自動注入的EntityManager到會話bean。

0

我有同樣的問題。我SLSB注入我DAO ojbect與@Inject,該@PersistenceContext是在POJO。當POJO是在同一個Maven項目的EJB,一切工作正常。林不知道爲什麼,但EJB不能注入POJO(w /聚氨酯),當它在一個不同的項目,除非我使POJO SLSB和使用@EJB而不是@Inject