FWIW I have a few versions in my sandbox of DayTrader updated for blueprint which support JPA direct persistence. I have both application managed (jbohn/daytrader-bp-AppEM) and container managed (jbohn/daytrader-bp-CntEM). Overall the code has been reorganized for blueprint but the core function is mostly unchanged ... so they might be helpful or at least an interesting comparison.
Joe Donald Woods wrote:
I'd prefer the application managed approach, as the Java EE version of Daytrader uses container managed. Thanks for helping with this. -Donald On 1/20/10 2:10 AM, Forrest Xia wrote:Hi Donald, I tried the new assembly of daytrader -- daytrader-web-jpa, and did not get it work. The console log an error: 2010-01-20 14:08:24,774 ERROR [Log] Error: TradeJPADirect:createQuote -- exception creating Quote java.lang.NullPointerException java.lang.NullPointerException at org.apache.geronimo.samples.daytrader.core.direct.TradeJPADirect.createQuote(TradeJPADirect.java:418) at org.apache.geronimo.samples.daytrader.core.TradeAction.createQuote(TradeAction.java:373) at org.apache.geronimo.samples.daytrader.web.TradeBuildDB.<init>(TradeBuildDB.java:196) at org.apache.geronimo.samples.daytrader.web.TradeConfigServlet.service(TradeConfigServlet.java:411) at javax.servlet.http.HttpServlet.service(HttpServlet.java:806) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:420) at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:47) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:567) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:361) at org.apache.geronimo.pool.ThreadPool$1.run(ThreadPool.java:214) at org.apache.geronimo.pool.ThreadPool$ContextClassLoaderRunnable.run(ThreadPool.java:344) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Then I had a peek at the code, and think this NPE might be caused by PersistenceContext not injected in TradeJPADirect. Since TradeJPADirect is not a web container managed object(not servlet or context listener), so the annotation @PersistenceContext does not work. I guess daytrader-web-jpa assembly is to demo jpa usage in web module without session EJB involvement. If we want to demo container-managed entity manager via this assembly, we shall use @PersistenceContext on servlet or any web container managed object, then use JNDI lookup to get the entity manager from container. If we want to demo application-managed entity manager, we can use @PersistenceUnit to inject an EntityManagerFactory object in any web container managed object, then use EntityManagerFactory.createEntityManager() to get entity manager. Please kindly let me know your thoughts. Thanks! Forrest
