0

Это был старый проект 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) 

Спасибо!

ответ

1

Если вы хотите сохранить строки длиной более 500 символов Юникода, вам нужно использовать Text. См. Datastore Properties & Value Types.

+0

Да, но actully Я не собираюсь хранить прямую прямую, я просто хочу добавить объект Image в сборку Image в классе User. Даже из-за слишком длинной строки. Но я ничего не могу с этим поделать, потому что я не могу установить, как внешний ключ хранится в хранилище данных. –

+1

, если вы не собираетесь напрямую хранить строку, почему она пытается сохранить строку, например ... Image.name, Image.path? они по-прежнему сохраняются по умолчанию. Один из них более 500 в длину, и если вы не хотите их упорствовать, то вы отмечаете как @NotPersistent – DataNucleus

+0

Да, я делаю, но год назад. Эти области могут сохраняться. Я не думаю, что имя изображения будет более 500. Возможно, путь к файлу может быть более 500. Я проверю его. –

Смежные вопросы