【问题标题】:Objectify - UnsupportedOperationException when loading entity by id in transactionObjectify - 在事务中按 id 加载实体时出现 UnsupportedOperationException
【发布时间】:2014-03-27 17:38:25
【问题描述】:

我有一个继承自 Page 类的 User 类。在事务中,我希望通过 ID 加载用户实体(从不同的实体获得),但我得到了由 UnsupportedOperationException 引起的 LoadException。我正在使用 objectify 4.0-rc2。

User user = MyObjectifyService.ofy().load().type(User.class).id(info.user).now();

例外是:

com.googlecode.objectify.LoadException: Error loading Page(5629499534213120): null
at com.googlecode.objectify.impl.Transmog.load(Transmog.java:76)
at com.googlecode.objectify.impl.ConcreteEntityMetadata.load(ConcreteEntityMetadata.java:121)
at com.googlecode.objectify.impl.PolymorphicEntityMetadata.load(PolymorphicEntityMetadata.java:164)
at com.googlecode.objectify.impl.LoadEngine.load(LoadEngine.java:220)
at com.googlecode.objectify.impl.LoadEngine$1.nowUncached(LoadEngine.java:178)
at com.googlecode.objectify.impl.LoadEngine$1.nowUncached(LoadEngine.java:164)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:73)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.LoadResult.now(LoadResult.java:25)
...
com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:487)
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.UnsupportedOperationException
    at java.util.AbstractList.remove(Unknown Source)
    at java.util.AbstractList$Itr.remove(Unknown Source)
    at java.util.AbstractList.removeRange(Unknown Source)
    at java.util.AbstractList.clear(Unknown Source)
    at com.googlecode.objectify.impl.translate.CollectionTranslatorFactory$1.loadListIntoExistingCollection(CollectionTranslatorFactory.java:66)
    at com.googlecode.objectify.impl.TranslatableProperty.executeLoad(TranslatableProperty.java:62)
    at com.googlecode.objectify.impl.translate.ClassTranslator.loadMap(ClassTranslator.java:115)
    at com.googlecode.objectify.impl.translate.MapNodeTranslator.loadAbstract(MapNodeTranslator.java:25)
    at com.googlecode.objectify.impl.translate.AbstractTranslator.load(AbstractTranslator.java:25)
    at com.googlecode.objectify.impl.Transmog.load(Transmog.java:82)
    at com.googlecode.objectify.impl.Transmog.load(Transmog.java:71)
    ... 68 more

【问题讨论】:

  • 值得注意的是,ID 来自一个在同一事务中加载的实体(就在抛出异常的行之前),但带有一个 transactionless() 对象化。
  • 请尝试使用 Objectify 4.0.1 的发布版本
  • 试过了,4.0.1和4.1都一样

标签: google-app-engine objectify


【解决方案1】:

您正在将数据加载到集合字段中。如果字段已经用一个初始化,则 Objectify 使用现有集合(因此您可以拥有具有特殊排序比较器等的集合)。看起来你已经用某种不可修改的列表初始化了你的集合字段。

用普通的 ArrayList 或任何你想要的东西来初始化列表。

【讨论】:

  • 是的,我确实使用了 Arrays.asList() 来创建一个不可变列表。谢谢!
【解决方案2】:

也许它是相关的,但我不认为,这里也有一个不可变集合,但是当 GAE 关闭并第一次出现时会发生错误(更多详细信息:https://code.google.com/p/objectify-appengine/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id=165

java.lang.NullPointerException
    at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:73)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.util.ResultNowFunction.apply(ResultNowFunction.java:20)
    at com.googlecode.objectify.util.ResultNowFunction.apply(ResultNowFunction.java:9)
    at com.google.common.collect.Iterators$8.transform(Iterators.java:860)
    at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
    at com.googlecode.objectify.impl.Chunk.next(Chunk.java:27)
    at com.googlecode.objectify.impl.Chunk.next(Chunk.java:10)
    at com.google.common.collect.Iterators$5.next(Iterators.java:607)
    at com.google.common.collect.Iterators$PeekingImpl.peek(Iterators.java:1239)
    at com.googlecode.objectify.impl.ChunkingIterator.hasNext(ChunkingIterator.java:52)
    at com.google.common.collect.Lists.newArrayList(Lists.java:144)
    at com.google.common.collect.Lists.newArrayList(Lists.java:125)
    at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:21)
    at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:11)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.util.ResultProxy.invoke(ResultProxy.java:34)
    at com.sun.proxy.$Proxy21.iterator(Unknown Source)
    at java.util.Collections$UnmodifiableCollection$1.<init>(Collections.java:1064)
    at java.util.Collections$UnmodifiableCollection.iterator(Collections.java:1063)
    at flexjson.transformer.IterableTransformer.transform(IterableTransformer.java:26)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2020-08-20
    • 2012-10-01
    相关资源
    最近更新 更多