[objectify-appengine] Issue with Map vs. HashMap in defining an embedded collection

156 views
Skip to first unread message

Ken Bowen

unread,
May 16, 2010, 4:05:14 PM5/16/10
to objectify...@googlegroups.com
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

Jeff Schnitzer

unread,
May 16, 2010, 5:41:06 PM5/16/10
to objectify...@googlegroups.com
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
>
Reply all
Reply to author
Forward
0 new messages