Ошибка модуля Siena Play Framework при привязке к полю @Text в Cloud SQL на Google App Engine

Я пытаюсь переписать Play! руководство по YABE, чтобы его можно было запустить в Google App Engine с помощью модуля Siena. Я использую следующие версии игры и модулей:

  • Играть 1.2.5
  • крудсиена 2.0.3
  • сиена 2.0.7
  • гей 1.6.0

Я успешно настроил приложение, подключился к базе данных и могу хранить/извлекать данные в базу данных. Однако у меня возникла проблема с аннотацией @Text, предоставленной модулем Siena. Он правильно создает базу данных, используя тип данных MediumText для полей данных Post.content и Comment.content. Ниже приведен сгенерированный DDL из журналов GAE:

# ----------------------------------------------------------------------- 
# Comment 
# ----------------------------------------------------------------------- 

CREATE TABLE Comment
(
    id VARCHAR(255) NOT NULL,
    author VARCHAR(255) NULL,
    postedAt DATETIME,
    content MEDIUMTEXT NULL,
    post VARCHAR(255) NULL,
    PRIMARY KEY (id)
);

# ----------------------------------------------------------------------- 
# User 
# ----------------------------------------------------------------------- 

CREATE TABLE User
(
    id VARCHAR(255) NOT NULL,
    email VARCHAR(255) NULL,
    password VARCHAR(255) NULL,
    fullname VARCHAR(255) NULL,
    isAdmin TINYINT(1) DEFAULT false NOT NULL,
    PRIMARY KEY (id)
);

# ----------------------------------------------------------------------- 
# Tag 
# ----------------------------------------------------------------------- 

CREATE TABLE Tag
(
    id VARCHAR(255) NOT NULL,
    name VARCHAR(255) NULL,
    PRIMARY KEY (id)
);

# ----------------------------------------------------------------------- 
# Post 
# ----------------------------------------------------------------------- 

CREATE TABLE Post
(
    id VARCHAR(255) NOT NULL,
    title VARCHAR(255) NULL,
    postedAt DATETIME,
    content MEDIUMTEXT NULL,
    author VARCHAR(255) NULL,
    PRIMARY KEY (id)
);

Я аннотировал свое поле Post.content аннотацией @Text, как я видел Паскаль прокомментируйте несколько досок для использования. Я разместил свой класс Post ниже для справки:

package models;

import ...

public class Post extends Model {
    ...

    @Text
    @Required
    @MaxSize(10000)
    public String content;

    ...
}

Как я уже упоминал, все развертывается нормально, но когда я пытаюсь сохранить сообщение в базе данных, я получаю следующую трассировку стека:

play.Logger niceThrowable: 

@6cm6cpabp
Internal Server Error (500)

Execution exception (In /app/controllers/Application.java around line 28)
RuntimeException occured : Cannot load fixture initial-data.yml: Unexpected Error

play.exceptions.JavaExecutionException: Cannot load fixture initial-data.yml: Unexpected Error
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237)
    at play.server.ServletWrapper$ServletInvocation.execute(ServletWrapper.java:561)
    at play.Invoker$Invocation.run(Invoker.java:278)
    at play.server.ServletWrapper$ServletInvocation.run(ServletWrapper.java:552)
    at play.Invoker.invokeInThread(Invoker.java:68)
    at play.server.ServletWrapper.service(ServletWrapper.java:143)
    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 com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    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 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.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266)
    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 com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.RuntimeException: Cannot load fixture initial-data.yml: Unexpected Error
    at play.modules.siena.SienaFixtures.loadModels(SienaFixtures.java:273)
    at controllers.Application.index(Application.java:28)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
    at play.server.ServletWrapper$ServletInvocation.execute(ServletWrapper.java:561)
    at play.Invoker$Invocation.run(Invoker.java:278)
    at play.server.ServletWrapper$ServletInvocation.run(ServletWrapper.java:552)
    at play.Invoker.invokeInThread(Invoker.java:68)
    at play.server.ServletWrapper.service(ServletWrapper.java:143)
    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.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:454)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461)
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458)
    ... 1 more
Caused by: play.exceptions.UnexpectedException: Unexpected Error
    at play.modules.siena.SienaModelUtils.edit(SienaModelUtils.java:301)
    at play.modules.siena.SienaModelUtils.create(SienaModelUtils.java:58)
    at play.modules.siena.SienaPlugin.bind(SienaPlugin.java:331)
    at play.PlayPlugin.bind(PlayPlugin.java:68)
    at play.plugins.PluginCollection.bind(PluginCollection.java:579)
    at play.data.binding.Binder.bind(Binder.java:112)
    at play.data.binding.Binder.bind(Binder.java:92)
    at play.data.binding.Binder.bind(Binder.java:88)
    at play.modules.siena.SienaFixtures.loadModels(SienaFixtures.java:207)
    ... 34 more
Caused by: siena.SienaException: java.lang.IllegalArgumentException: Can not set java.lang.String field models.Post.content to com.google.cloud.sql.jdbc.internal.ClientSideClob
    at siena.Util.setField(Util.java:286)
    at siena.jdbc.JdbcMappingUtils.setFromObject(JdbcMappingUtils.java:205)
    at siena.jdbc.JdbcMappingUtils.mapField(JdbcMappingUtils.java:186)
    at siena.jdbc.JdbcMappingUtils.mapObject(JdbcMappingUtils.java:79)
    at siena.jdbc.JdbcMappingUtils.mapObject(JdbcMappingUtils.java:67)
    at siena.jdbc.JdbcMappingUtils.mapList(JdbcMappingUtils.java:92)
    at siena.jdbc.JdbcPersistenceManager.doFetch(JdbcPersistenceManager.java:636)
    at siena.jdbc.JdbcPersistenceManager.fetch(JdbcPersistenceManager.java:728)
    at siena.AbstractPersistenceManager.get(AbstractPersistenceManager.java:71)
    at siena.BaseQuery.get(BaseQuery.java:111)
    at play.modules.siena.SienaModelUtils.edit(SienaModelUtils.java:227)
    ... 42 more
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.String field models.Post.content to com.google.cloud.sql.jdbc.internal.ClientSideClob
    at siena.Util.setField(Util.java:284)
    ... 52 more

По сути, это удушающая попытка сопоставить поле содержимого из String с классом Google ClientSideClob. У кого-нибудь есть идеи?


person Michael Vaughan    schedule 22.12.2012    source источник


Ответы (1)


Оказывается, эта проблема возникает не во время вставки данных, а при чтении данных из базы данных. Она была исправлена ​​в текущей главной ветке siena на github. Я клонировал этот репозиторий, собрал siena jar из этой кодовой базы, скопировал его из целевого каталога в каталог lib модуля siena.

cp ~/projects/siena/source/target/siena-1.0.0-b6.jar modules/siena-2.0.7/lib/

Перераспределено, и исправлена ​​ошибка сопоставления между строкой и полем среднего текста в Google Cloud SQL.

person Michael Vaughan    schedule 23.12.2012
comment
Я добавил этот проект на github для тех, кто заинтересован. https://github.com/mikalveli/yabegae - person Michael Vaughan; 24.12.2012
comment
Есть ли причина, по которой вы использовали Play 1.x вместо Play 2? Я спрашиваю, потому что вы сейчас активно занимаетесь разработкой, в то время как Play 2 был выпущен некоторое время назад! - person user1076371; 01.01.2013
comment
@ user1076371 play 2.x использует сервлеты v3, которые не поддерживаются в GAE, поэтому при развертывании в GAE вы вынуждены использовать play 1.x (который, надеюсь, они продолжают разрабатывать) - person momo; 05.12.2013