John,
The JDO/JPA support for App Engine lives entirely in "userland". Like all
the other libraries under the sdk's <SDK_ROOT>/lib/user folder, you must
bundle it with your application in order to use it. One nice aspect about
the ORM support living in userland is that you can easily apply patches or
try new interim releases between official SDK releases.

On Tue, Sep 15, 2009 at 6:17 PM, John <[email protected]> wrote:

>
> Actually I think I have simplified this further. The basic issue seems
> to be referencing anything to do with the datastore from an ordinary
> servlet. So if I have a servlet
>
> import java.io.IOException;
>
> import javax.jdo.JDOHelper;
> import javax.jdo.PersistenceManagerFactory;
> import javax.servlet.ServletException;
> import javax.servlet.http.HttpServlet;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
>
> public class UploadFileServlet extends HttpServlet {
>        @Override
>        protected void service(HttpServletRequest request,
> HttpServletResponse response) throws ServletException, IOException {
>        }
>
>        private static final PersistenceManagerFactory PMF =
>
>  JDOHelper.getPersistenceManagerFactory("transactions-optional");
>
> }
>
> and  I send it a request I get the following exception
>
> WARNING: Nested in javax.servlet.ServletException: init:
> java.lang.NoClassDefFoundError: javax/jdo/JDOHelper
>         at
> com.cloudscapesolutions.wavacalculator.server.UploadFileServlet.<clinit>
> (UploadFileServlet.java:18)
>        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method)
>        at sun.reflect.NativeConstructorAccessorImpl.newInstance
> (NativeConstructorAccessorImpl.java:39)
>        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance
> (DelegatingConstructorAccessorImpl.java:27)
>        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>        at java.lang.Class.newInstance0(Class.java:355)
>        at java.lang.Class.newInstance(Class.java:308)
>        at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
>        at org.mortbay.jetty.servlet.ServletHolder.getServlet
> (ServletHolder.java:339)
>        at
> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
> 463)
>        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
> (ServletHandler.java:1093)
>        at
> com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter
> (TransactionCleanupFilter.java:43)
>        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
> (ServletHandler.java:1084)
>        at com.google.appengine.tools.development.StaticFileFilter.doFilter
> (StaticFileFilter.java:121)
>        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
> (ServletHandler.java:1084)
>        at org.mortbay.jetty.servlet.ServletHandler.handle
> (ServletHandler.java:360)
>        at org.mortbay.jetty.security.SecurityHandler.handle
> (SecurityHandler.java:216)
>        at org.mortbay.jetty.servlet.SessionHandler.handle
> (SessionHandler.java:181)
>        at org.mortbay.jetty.handler.ContextHandler.handle
> (ContextHandler.java:712)
>        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
> 405)
>        at
> com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle
> (DevAppEngineWebAppContext.java:54)
>        at org.mortbay.jetty.handler.HandlerWrapper.handle
> (HandlerWrapper.java:139)
>        at com.google.appengine.tools.development.JettyContainerService
> $ApiProxyHandler.handle(JettyContainerService.java:313)
>        at org.mortbay.jetty.handler.HandlerWrapper.handle
> (HandlerWrapper.java:139)
>        at org.mortbay.jetty.Server.handle(Server.java:313)
>        at
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
> 506)
>        at org.mortbay.jetty.HttpConnection$RequestHandler.content
> (HttpConnection.java:844)
>        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
>        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
>        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
>        at org.mortbay.io.nio.SelectChannelEndPoint.run
> (SelectChannelEndPoint.java:396)
>        at org.mortbay.thread.BoundedThreadPool$PoolThread.run
> (BoundedThreadPool.java:442)
> Caused by: java.lang.ClassNotFoundException: javax.jdo.JDOHelper
>        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
>        at
> com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass
> (IsolatedAppClassLoader.java:142)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
>        ... 32 more
> 15-Sep-2009 22:11:21 com.google.apphosting.utils.jetty.JettyLogger
> warn
> WARNING: /wavacalculator/fileupload
> java.lang.NoClassDefFoundError: javax/jdo/JDOHelper
>         at
> com.cloudscapesolutions.wavacalculator.server.UploadFileServlet.<clinit>
> (UploadFileServlet.java:18)
>        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method)
>        at sun.reflect.NativeConstructorAccessorImpl.newInstance
> (NativeConstructorAccessorImpl.java:39)
>        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance
> (DelegatingConstructorAccessorImpl.java:27)
>        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>        at java.lang.Class.newInstance0(Class.java:355)
>        at java.lang.Class.newInstance(Class.java:308)
>        at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
>        at org.mortbay.jetty.servlet.ServletHolder.getServlet
> (ServletHolder.java:339)
>        at
> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
> 463)
>        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
> (ServletHandler.java:1093)
>        at
> com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter
> (TransactionCleanupFilter.java:43)
>        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
> (ServletHandler.java:1084)
>        at com.google.appengine.tools.development.StaticFileFilter.doFilter
> (StaticFileFilter.java:121)
>        at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter
> (ServletHandler.java:1084)
>        at org.mortbay.jetty.servlet.ServletHandler.handle
> (ServletHandler.java:360)
>        at org.mortbay.jetty.security.SecurityHandler.handle
> (SecurityHandler.java:216)
>        at org.mortbay.jetty.servlet.SessionHandler.handle
> (SessionHandler.java:181)
>        at org.mortbay.jetty.handler.ContextHandler.handle
> (ContextHandler.java:712)
>        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:
> 405)
>        at
> com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle
> (DevAppEngineWebAppContext.java:54)
>        at org.mortbay.jetty.handler.HandlerWrapper.handle
> (HandlerWrapper.java:139)
>        at com.google.appengine.tools.development.JettyContainerService
> $ApiProxyHandler.handle(JettyContainerService.java:313)
>        at org.mortbay.jetty.handler.HandlerWrapper.handle
> (HandlerWrapper.java:139)
>        at org.mortbay.jetty.Server.handle(Server.java:313)
>        at
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
> 506)
>        at org.mortbay.jetty.HttpConnection$RequestHandler.content
> (HttpConnection.java:844)
>        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
>        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
>        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
>        at org.mortbay.io.nio.SelectChannelEndPoint.run
> (SelectChannelEndPoint.java:396)
>        at org.mortbay.thread.BoundedThreadPool$PoolThread.run
> (BoundedThreadPool.java:442)
> Caused by: java.lang.ClassNotFoundException: javax.jdo.JDOHelper
>        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
>        at java.security.AccessController.doPrivileged(Native Method)
>        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
>        at
> com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass
> (IsolatedAppClassLoader.java:142)
>        at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
>        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
>        ... 32 more
>
> I am sure I must have missed some discussion on how to set up servlets
> to get them working in GAE. Help appreciated, been banging my head
> against this all day!!
>
> Cheers, J
>
>
>
> On Sep 15, 10:58 pm, John <[email protected]> wrote:
> > In an attempt to load data into a fledgling GAE Java application I am
> > using XStream (xstream-gae.jar a patched version that others have
> > developed to get a working version with GAE) coupled with a
> > FileUploadServlet that upload an XML file description of some initial
> > application to prime the application datastore.
> >
> > The problem I am encountering is that the Objects being created from
> > XStream have been annotated with persistence annotations
> > (@PersistenceCapable(identityType=IdentityType.APPLICATION) ...) to
> > make them usable with the data store.
> >
> > When the servlet is executed to process the uploaded file stream I get
> > a ClassCastExceptions for some of the app engines persistence related
> > files, e.g
> >
> > WARNING: Error for /wavacalculator/fileupload
> > java.lang.NoClassDefFoundError: javax/jdo/JDOHelper
> >
> > I am assuming that I am missing something important about the GAE
> > model in terms of ClassLoaders or configuration. It seems that the
> > Servlet is attempting to resolve fundemental classes (from its own
> > classloader??) and failing to find them, and whats more is not able to
> > find them in a parent/containing loader.
> >
> > Is there something special that I need to do to have a non GWT RPC
> > servlet with GAE? My UploadFileServlet extends HttpServlet and does
> > not special initialization.
> >
> > Out of interest I placed a number of the core jars such as
> > jdo2-api-2.3-eb.jar
> > datanucleus-jpa-1.1.5.jar
> > datanucleus-core-1.1.5.jar
> >
> > into the war/WEB-INF/lib area and the initial class loading problems
> > stopped, but other issues popped up elsewhere, also it feels wrong to
> > be duplicating framework jar files in the war lib.
> >
> > Any suggestions or pointers gratefully accepted. If I can get past
> > these problems I hope to post a tutorial on migrating data from
> > hibernate to app engine using a combination of tools with XStream as
> > the transition medium.
> >
> > Regards,
> >
> > John
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to