2013-02-13 54 views
0

我知道有大量問題涉及到類似問題,但我沒有設法爲我的問題提取解決方案。JPA EntityManager Nullpointer在多個類中拆分功能時出現異常(GlassFish,EclipseLink)

我正在嘗試構建一個RESTful Web應用程序,它提供使用JPA(EclipseLink 2.4)提供的數據,並在Glassfish 3.1.2.2上運行。

爲了測試我設置MySQL中的留言數據庫,並創造了這個集所有功能於一身的解決方案:

// imports etc... 
// Guestbook class has @Entity 

@Stateless 
@Path("guestbook") 
public class GuestService { 

    @PersistenceContext 
    private EntityManager em; 

    @GET 
    public Response entry() { 
     Guestbook entry = em.find(Guestbook.class, someid); 
     return Response.ok(entry.getMsg()).build(); 
    } 
} 

這工作得很好,但我想它在幾個層,像這樣分割:REST - > DAO - >實體 這將轉變爲:

@Stateless 
@Path("guestbook") 
public class GuestService { 

    private DAO dao; 

    @GET 
    public Response entry() { 
     Guestbook entry = dao.getEntry(someid); 
     return Response.ok(entry.getMsg()).build(); 
    } 
} 

// ... 

public class DAO { 
    @PersistenceContext 
    private EntityManager em; 

    public Guestbook getEntry(int someid) { 
     return em.find(Guestbook.class, someid); 
    } 
} 

所以訪問EM在getEntry(當這會產生一個空指針異常),因爲它是。 我的persistence.xml看起來是這樣的:提前

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="..." xmlns:xsi="..." xsi:schemaLocation="..."> 
    <persistence-unit name="guestbook" transaction-type="JTA"> 
     <jta-data-source>jdbc/mysqldatasource</jta-data-source> 
     <class>model.Guestbook</class> 
    </persistence-unit> 
</persistence> 

謝謝,我很期待您的建議!

回答

0

你從抽象GuestService就好了DAO,但似乎你忘了做一個DAO EJB @Stateless和你使用@EJB註釋GuestService在注入它。

@Stateless 
public class DAO { 

    @PersistenceContext 
    private EntityManager em; 
    ... 
} 

@Stateless 
@Path("guestbook") 
public class GuestService { 

    @EJB 
    private DAO dao; 
    ... 
} 

我希望它有幫助!

+0

非常感謝你,這真的幫助了我,並暗示了我犯的錯誤。我已經按照您的建議使用了這些註釋。現在,我得到了這個工作,我試圖讓REST類實現一個接口,但這給了我另一個錯誤(java.lang.IllegalArgumentException:對象不是一個聲明類的實例)。你可以暗示這個錯誤的來源嗎?再次感謝! – Imperative 2013-02-14 10:39:15