2014-06-05 86 views
1

我最近在學習J2EE。 我使用IntelliJ,我的網絡服務器是Tomcat。我想將OpenJPA添加到我的項目中,但遇到一些問題。在Tomcat上使用OpenJPA時獲取NullPointerException

我有兩個實體:BooksEntitySourcesEntity

當我在Servlet中調用createEntityManager()時,它給了我一個NullPointerException

看來我錯過了什麼,但我不知道爲什麼。

下面是異常信息:

java.lang.NullPointerException 
    controller.TestServlet.doGet(TestServlet.java:28) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

這是我TestServlet.java文件:

@WebServlet(name = "TestServlet", urlPatterns = {"/books"}) 
public class TestServlet extends HttpServlet { 

    @PersistenceUnit (unitName = "booksPU") 
    private EntityManagerFactory emf; 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     EntityManager em = emf.createEntityManager(); 

     Query query = em.createNamedQuery("Books.findAll"); 

     request.setAttribute("books", (List<BooksEntity>) query.getResultList()); 
     request.getRequestDispatcher("index.jsp").forward(request, response); 
    } 
} 

唯一的例外是在這行拋出:EntityManager em = emf.createEntityManager();

這是我context.xml文件:

<Context> 
    <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" 
       maxActive="100" maxIdle="30" maxWait="10000" 
       username="root" password="******" driverClassName="com.mysql.jdbc.Driver" 
       url="jdbc:mysql://localhost:3306/FIRST_TEST"/> 
</Context> 

persistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 

    <persistence-unit name="booksPU"> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
     <class>model.BooksEntity</class> 
     <class>model.SourcesEntity</class> 
     <properties> 
      <property name="openjpa.ConnectionURL" value="jdbc:mysql://localhost:3306/FIRST_TEST"/> 
      <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver"/> 
      <property name="openjpa.ConnectionUserName" value="root"/> 
      <property name="openjpa.ConnectionPassword" value="******"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

======== ======== 2014年6月6日

我的目錄結構:

My directory structure

======== 2014.06.07 ========

Package

+0

你也應該讓我們如何打包你的應用程序。 – Rick

+0

@Rick我上傳了關於我的項目目錄結構的圖像。你的意思是這個嗎? – h1994st

+0

我不知道在Tomcat中運行的webapp可以使用PersistenceUnit註釋而無需Spring或類似的庫注入,你有沒有?我爲我的個人項目創建了這個tomcat + openjpa包裝器,但它沒有使用註釋注入,https://github.com/Murmur/ScopedEntityManager – Whome

回答

0

這可能只是您的代碼中的一個錯字。註釋應該是@PersistenceContext,而不是@PersistentUnit。這就是爲什麼emf仍然是null

+0

我認爲這不是一個錯誤。 「@PersistenceUnit」用於「EntityManagerFactory」,「@PersistenceContext」用於「EntityManager」。他們是不同的。 – h1994st

+0

儘管我直接使用了'@ PersistenceContext'和'EntityManager','EntityManager em'仍然是'null' :( – h1994st

0

確保在打包war文件時,persistence.xml位於WEB-INF/classes/META-INF文件夾中。

+0

我上傳了一張新圖片,是這樣嗎?我做到了,但它仍然無法工作。 – h1994st

相關問題