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


Reply via email to