Odd... neither Map nor HashMap are types supported by GAE or
Objectify. You should get some sort of nastygram either way.
Jeff
On Sun, May 16, 2010 at 1:05 PM, Ken Bowen <
k...@form-runner.com> wrote:
> I bumped into the following which is not a serious problem.
> But the corresponding problem doesn't arise with List/ArrayList.
>
> If I define an embedded collection field in class FormInstance by
>
> HashMap<String,com.formrunner.data.FormFieldValue> fieldValues = new
> HashMap<String,com.formrunner.data.FormFieldValue>();
>
> everything works ok.
>
> However, if I define this by
>
> Map<String,com.formrunner.data.FormFieldValue> fieldValues = new
> HashMap<String,com.formrunner.data.FormFieldValue>();
>
> then
>
> ObjectifyService.register(com.formrunner.db.FormInstance.class);
>
> throws the following Exception:
>
> java.lang.IllegalStateException: There must be a no-arg constructor for
> java.util.Map
> at
> com.googlecode.objectify.impl.TypeUtils.getNoArgConstructor(TypeUtils.java:91)
> at
> com.googlecode.objectify.impl.load.EmbeddedClassSetter.<init>(EmbeddedClassSetter.java:26)
> at
> com.googlecode.objectify.impl.Transmog$Visitor.visitField(Transmog.java:204)
> at
> com.googlecode.objectify.impl.Transmog$Visitor.visitClass(Transmog.java:132)
> at com.googlecode.objectify.impl.Transmog.<init>(Transmog.java:305)
> at
> com.googlecode.objectify.impl.EntityMetadata.<init>(EntityMetadata.java:79)
> at
> com.googlecode.objectify.ObjectifyFactory.register(ObjectifyFactory.java:139)
> at
> com.googlecode.objectify.ObjectifyService.register(ObjectifyService.java:38)
> at
> com.formrunner.data.FormrunnerDBMgr.<clinit>(FormrunnerDBMgr.java:69)
> at com.formrunner.data.DBHandler.<init>(DBHandler.java:57)
> at com.formrunner.data.DBHandler.instance(DBHandler.java:49)
> at com.formrunner.admin.AdminIntf.recordHost(AdminIntf.java:46)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100)
> at
> org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
> at
> org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
> at
> org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
> at
> org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
> at
> org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
> at
> org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
> at
> org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
> at
> org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
> at
> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
> at
> com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
> at
> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
> at
> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
> at
> com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
> at
> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
> at
> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
> at
> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
> at
> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
> at
> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
> at
> org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
> at
> com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
> at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
> at
> com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
> at
> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
> at org.mortbay.jetty.Server.handle(Server.java:326)
> at
> org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
> at
> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
> at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
> at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
> at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
> at
> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
> at
> org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
> Caused by: java.lang.NoSuchMethodException: java.util.Map.<init>()
> at java.lang.Class.getConstructor0(Class.java:2706)
> at java.lang.Class.getDeclaredConstructor(Class.java:1985)
> at
> com.googlecode.objectify.impl.TypeUtils.getNoArgConstructor(TypeUtils.java:85)
> ... 50 more
>
>
> --Ken
>