2015-09-18 173 views
0

我有這個簡單的EJB類。當我嘗試注入EntityManager比如我得到一個NullPointerException注入EntityManager時出現NullPointerException

Caused by: java.lang.NullPointerException 
at pl.take.server.model.WholesaleEJB.createClient(WholesaleEJB.java:54) [:] 

的問題是什麼我做錯了,我該如何解決?我正在使用netbeans和jboss 6.1。感謝您的時間。

@Stateless 
public class WholesaleEJB { 

    @PersistenceContext(unitName = "wholesale") 
    EntityManager entityManager; 

    public void createClient(Clients client) { 
     entityManager.persist(client);   //Error line 
    } 

} 

的persistence.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="wholesale" transaction-type="JTA"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 
<jta-data-source>java:/Wholesale</jta-data-source> 
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
<properties> 
    <property name="hibernate.hbm2ddl.auto" value="update"/> 
</properties> 
</persistence-unit> 
</persistence> 

編輯:

類REST與實例WholesaleEJB:

@Stateless 
@Path("/wholesale") 
public class WholesaleREST{ 

    @EJB 
    private WholesaleEJB wholesaleEJB = new WholesaleEJB(); 

    @POST 
    @Path("/create") 
    public String createClient(InputStream is) { 
     Clients clients = JAXB.unmarshal(is, Clients.class); 
     wholesaleEJB.createClient(clients); 
     return "Client created!"; 
    } 
} 

完整的錯誤:

00:31:56,458 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/WholesaleApp].[default]] Servlet.service() for servlet default threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException 
    at org.jboss.resteasy.core.SynchronousDispatcher.unwrapException(SynchronousDispatcher.java:345) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:321) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:214) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:190) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:534) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:496) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:155) [:6.1.0.Final] 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:212) [:6.1.0.Final] 
    at org.jboss.resteasy.plugins.server.servlet.FilterDispatcher.doFilter(FilterDispatcher.java:59) [:6.1.0.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274) [:6.1.0.Final] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final] 
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final] 
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final] 
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final] 
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final] 
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final] 
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final] 
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final] 
    at java.lang.Thread.run(Thread.java:745) [:1.8.0_51] 
Caused by: java.lang.NullPointerException 
    at pl.take.server.model.WholesaleEJB.createClient(WholesaleEJB.java:48) [:] 
    at pl.take.server.model.WholesaleREST.createClient(WholesaleREST.java:57) [:] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.8.0_51] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [:1.8.0_51] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.8.0_51] 
    at java.lang.reflect.Method.invoke(Method.java:497) [:1.8.0_51] 
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140) [:6.1.0.Final] 
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:255) [:6.1.0.Final] 
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:220) [:6.1.0.Final] 
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:209) [:6.1.0.Final] 
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:519) [:6.1.0.Final] 
    ... 23 more 

完整的日誌從服務器deploing項目: http://pastebin.com/Ki3Gz4RA

+0

您是否嘗試從'@ PersistenceContext'註釋中移除'unitName'參數? – Everv0id

+0

發佈完整的堆棧跟蹤。顯示您獲得WholesaleEJB實例的代碼。 –

+0

@ Everv0id是的,我試過了。同樣的錯誤。 – pawkondr

回答

0

這是你的問題:

@EJB 
private WholesaleEJB wholesaleEJB = new WholesaleEJB(); 

通過調用構造函數,你正在構建一個POJO爲wholesaleEJB。 EJB的工作原理是允許容器創建一個遠程代理,該代理在POJO周圍包裝EJB服務(包括依賴注入)。

替換爲這樣:

@EJB 
private WholesaleEJB wholesaleEJB; 

然後容器將讀取的註釋,注入EJB的副本,並準備好爲你打電話。如果你想自己控制進程(你不應該),你可以使用JNDI查找來獲得EJB對象,而不是直接調用構造函數。

+0

我做到了。現在我有: '由於:java.lang.NullPointerException \t at pl.take.server.model.WholesaleREST.createClient(WholesaleREST.java:32)[:]' – pawkondr

+0

好吧,那個問題顯示依賴注入不是加工。當你獲得NPE時,你在JBoss上運行嗎?您是否看到如下第一行的消息:https://developer.jboss.org/thread/233440#842013關於WholesaleREST?這將告訴我們JBoss是否正確地找到並部署了這個bean。 – hugh

+0

部署是成功的。當我從客戶端調用方法時,我得到了NPE。然後服務器從帖子中拋出錯誤。我還添加了從部署到發佈的完整日誌,但是我發現有趣的行: '14:09:23,616 WARN [org.hibernate.ejb.Ejb3Configuration]持久性提供者調用者沒有正確實現EJB3規範.PersistenceUnitInfo.getNewTempClassLoader()爲null 「這很重要嗎? – pawkondr

0

可能您的Application Server與EJB 3.1不兼容,並且無法以此方式執行EJB注入。

您可以嘗試使用所需的方法爲您的EJB創建一個接口,然後將其注入到REST服務中。

相關問題