Это был старый проект GAE год назад. В то время он отлично работает. Недавно я снова попытался работать над этим проектом, но теперь он не работает. Я выяснил, в чем проблема, но я не знаю, как ее решить.Google app engine JPA onetomany relationship add fail with IllegalArgumentException: Строка более 500 символов
Добавить нового пользователя в порядке. но когда я пытаюсь добавить изображение пользователя, файл изображения сам хранится в blobstore успешно, но объект записи Image
не может быть сохранен.
Похоже, что gae не удалось установить значение поля image
в таблице User и придумать странную ошибку, которая говорит, что String слишком длинная. Вероятно, это связано с загрузкой LAZY.
Я был бы appercaite, если бы вы могли мне помочь.
Вот мои сущности и код, где произошла ошибка. OnetoMany отношения в объекта пользователя: Entity
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Integer userid;
String username;
String password;
String email;
@OneToMany()
Collection<Image> images;
// getter and setter....
}
Изображение:
@Entity
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Key key;
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Integer imageid;
private String name;
// full path of blobstore
private String path;
private Date uploadtime;
}
Если ошибка происходит:
//ImageService.java/uploadImage
user = userDao.findUser(userid);
Collection<Image> images = user.getImages();
images.add(image); // Exception occurs here
user.setImages(images);
userDao.update(user);
трассировки стека:
com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.IllegalArgumentException: path: String properties must be 500 characters or less. Instead, use com.google.appengine.api.datastore.Text, which can store strings of any length.
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedSingleValue(DataTypeUtils.java:242)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:207)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:173)
at com.google.appengine.api.datastore.DataTypeUtils.checkSupportedValue(DataTypeUtils.java:148)
at com.google.appengine.api.datastore.PropertyContainer.setProperty(PropertyContainer.java:101)
at com.google.appengine.datanucleus.EntityUtils.setEntityProperty(EntityUtils.java:169)
at com.google.appengine.datanucleus.StoreFieldManager.storeFieldInEntity(StoreFieldManager.java:245)
at com.google.appengine.datanucleus.StoreFieldManager.storeStringField(StoreFieldManager.java:168)
at org.datanucleus.state.AbstractStateManager.providedStringField(AbstractStateManager.java:1438)
at com.nhm.persistence.entity.Image.jdoProvideField(Image.java)
at com.nhm.persistence.entity.Image.jdoProvideFields(Image.java)
at org.datanucleus.state.AbstractStateManager.provideFields(AbstractStateManager.java:1520)
at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal(DatastorePersistenceHandler.java:232)
at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:214)
at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2371)
at org.datanucleus.state.JDOStateManager.makePersistent(JDOStateManager.java:2347)
at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1798)
at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1892)
at org.datanucleus.store.types.sco.SCOUtils.validateObjectForWriting(SCOUtils.java:1501)
at com.google.appengine.datanucleus.scostore.AbstractFKStore.validateElementForWriting(AbstractFKStore.java:383)
at com.google.appengine.datanucleus.scostore.FKListStore.validateElementForWriting(FKListStore.java:1029)
at com.google.appengine.datanucleus.scostore.FKListStore.internalAdd(FKListStore.java:193)
at com.google.appengine.datanucleus.scostore.FKListStore.addAll(FKListStore.java:114)
at org.datanucleus.store.types.sco.backed.ArrayList.addAll(ArrayList.java:727)
at org.datanucleus.store.types.sco.backed.ArrayList.initialise(ArrayList.java:161)
at org.datanucleus.store.types.sco.SCOUtils.createSCOWrapper(SCOUtils.java:249)
at org.datanucleus.store.types.sco.SCOUtils.newSCOInstance(SCOUtils.java:140)
at org.datanucleus.state.JDOStateManager.wrapSCOField(JDOStateManager.java:2225)
at org.datanucleus.state.AbstractStateManager.setObjectField(AbstractStateManager.java:2051)
at com.nhm.persistence.entity.User.jdoSetimages(User.java)
at com.nhm.persistence.entity.User.setImages(User.java:131)
at com.nhm.web.service.ImageService.uploadImage(ImageService.java:96)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:43)
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
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 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.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:480)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:487)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:774)
at com.google.tracing.TraceContext$DoInTraceContext.runInContext(TraceContext.java:751)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:342)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:334)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:484)
at java.lang.Thread.run(Thread.java:679)
Спасибо!
Да, но actully Я не собираюсь хранить прямую прямую, я просто хочу добавить объект Image в сборку Image в классе User. Даже из-за слишком длинной строки. Но я ничего не могу с этим поделать, потому что я не могу установить, как внешний ключ хранится в хранилище данных. –
, если вы не собираетесь напрямую хранить строку, почему она пытается сохранить строку, например ... Image.name, Image.path? они по-прежнему сохраняются по умолчанию. Один из них более 500 в длину, и если вы не хотите их упорствовать, то вы отмечаете как @NotPersistent – DataNucleus
Да, я делаю, но год назад. Эти области могут сохраняться. Я не думаю, что имя изображения будет более 500. Возможно, путь к файлу может быть более 500. Я проверю его. –