试图在数据库中存储 Json 时的 Ebean 'No service implementation found for SpiJsonService'
Ebean 'No service implementation found for SpiJsonService' when trying to store Json in DB
我正在尝试将模型的一部分作为 Json 存储在我的数据库中。 Ebean 应该有这个助手 :
@DbJson
public Map<String, Object> jsonContent;
但是当我尝试存储我的 bean 时,它只有在我不给它 jsonContent
字段的情况下才有效。一旦我尝试设置它,我就会收到以下错误:
play.api.http.HttpErrorHandlerExceptions$$anon: Execution exception[[CompletionException: java.lang.ExceptionInInitializerError]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:251)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:178)
at play.core.server.AkkaHttpServer$$anonfun.applyOrElse(AkkaHttpServer.scala:343)
at play.core.server.AkkaHttpServer$$anonfun.applyOrElse(AkkaHttpServer.scala:341)
at scala.concurrent.Future.$anonfun$recoverWith(Future.scala:414)
at scala.concurrent.impl.Promise.$anonfun$transformWith(Promise.scala:37)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run(BatchingExecutor.scala:91)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
Caused by: java.util.concurrent.CompletionException: java.lang.ExceptionInInitializerError
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)
at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.ExceptionInInitializerError: null
at io.ebeaninternal.server.type.ScalarTypeJsonMap.formatValue(ScalarTypeJsonMap.java:166)
at io.ebeaninternal.server.type.ScalarTypeJsonMap.bind(ScalarTypeJsonMap.java:148)
at io.ebeaninternal.server.type.ScalarTypeJsonMap$Clob.bind(ScalarTypeJsonMap.java:55)
at io.ebeaninternal.server.deploy.BeanProperty.bind(BeanProperty.java:648)
at io.ebeaninternal.server.persist.dml.DmlHandler.bindInternal(DmlHandler.java:226)
at io.ebeaninternal.server.persist.dml.DmlHandler.bind(DmlHandler.java:198)
at io.ebeaninternal.server.persist.dmlbind.BindableProperty.dmlBind(BindableProperty.java:54)
at io.ebeaninternal.server.persist.dmlbind.BindableList.dmlBind(BindableList.java:62)
at io.ebeaninternal.server.persist.dml.InsertMeta.bind(InsertMeta.java:162)
at io.ebeaninternal.server.persist.dml.InsertHandler.bind(InsertHandler.java:97)
Caused by: java.lang.IllegalStateException: No service implementation found for SpiJsonService?
at io.ebean.text.json.EJson.init(EJson.java:31)
at io.ebean.text.json.EJson.<clinit>(EJson.java:23)
at io.ebeaninternal.server.type.ScalarTypeJsonMap.formatValue(ScalarTypeJsonMap.java:166)
at io.ebeaninternal.server.type.ScalarTypeJsonMap.bind(ScalarTypeJsonMap.java:148)
at io.ebeaninternal.server.type.ScalarTypeJsonMap$Clob.bind(ScalarTypeJsonMap.java:55)
at io.ebeaninternal.server.deploy.BeanProperty.bind(BeanProperty.java:648)
at io.ebeaninternal.server.persist.dml.DmlHandler.bindInternal(DmlHandler.java:226)
at io.ebeaninternal.server.persist.dml.DmlHandler.bind(DmlHandler.java:198)
at io.ebeaninternal.server.persist.dmlbind.BindableProperty.dmlBind(BindableProperty.java:54)
at io.ebeaninternal.server.persist.dmlbind.BindableList.dmlBind(BindableList.java:62)
[INFO] [08/06/2018 16:03:23.475] [Thread-2] [CoordinatedShutdown(akka://sbt-web)] Starting coordinated
我的豆子看起来像这样:
@Entity
@Table(name = "my_table")
public class MyBean extends AManageableModel {
public static final Finder<Long, Configuration> find = new Finder<>(MyBean.class);
@Constraints.Required
public String name;
@Constraints.Required
@JsonProperty("some_property")
public String someProperty;
@DbJson
@JsonProperty("json_content")
public Map<String, Object> jsonContent;
}
当我使用以下 Json 在数据库中创建一行时,它起作用了(jsonContent
是 null
):
{
"name": "test 1",
"some_property": "some property content"
}
但是当我使用下面的 Json :
{
"name": "test 1",
"some_property": "some property content",
"json_content": {
"test":"test",
"test2":"test2"
}
}
它崩溃了(请参阅 post 的开头以获得完整的 stackTrace)。
使用 Jackson 完成序列化:
Json.fromJson(jsonData, MyBean.class);
好的,所以使用:
Map<String,String> jsonContent
而不是:
Map<String,Object> jsonContent
对我有用,所以我怀疑 "Object" 需要扩展可序列化的东西。
编辑:
所以,2 年后我不得不使用 Map<String,Object> jsonContent
出于不相关的原因,同样的问题又回来了。这是一个肮脏的解决方案,在应用程序启动时调用它:
try {
EJson.write(new Object());
} catch (IOException e1) {
e1.printStackTrace();
}
这会强制 EJson
加载,问题就消失了....但是该死的脏了。
我正在尝试将模型的一部分作为 Json 存储在我的数据库中。 Ebean 应该有这个助手 :
@DbJson
public Map<String, Object> jsonContent;
但是当我尝试存储我的 bean 时,它只有在我不给它 jsonContent
字段的情况下才有效。一旦我尝试设置它,我就会收到以下错误:
play.api.http.HttpErrorHandlerExceptions$$anon: Execution exception[[CompletionException: java.lang.ExceptionInInitializerError]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:251)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:178)
at play.core.server.AkkaHttpServer$$anonfun.applyOrElse(AkkaHttpServer.scala:343)
at play.core.server.AkkaHttpServer$$anonfun.applyOrElse(AkkaHttpServer.scala:341)
at scala.concurrent.Future.$anonfun$recoverWith(Future.scala:414)
at scala.concurrent.impl.Promise.$anonfun$transformWith(Promise.scala:37)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55)
at akka.dispatch.BatchingExecutor$BlockableBatch.$anonfun$run(BatchingExecutor.scala:91)
at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
Caused by: java.util.concurrent.CompletionException: java.lang.ExceptionInInitializerError
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:273)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:280)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1592)
at java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1582)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.ExceptionInInitializerError: null
at io.ebeaninternal.server.type.ScalarTypeJsonMap.formatValue(ScalarTypeJsonMap.java:166)
at io.ebeaninternal.server.type.ScalarTypeJsonMap.bind(ScalarTypeJsonMap.java:148)
at io.ebeaninternal.server.type.ScalarTypeJsonMap$Clob.bind(ScalarTypeJsonMap.java:55)
at io.ebeaninternal.server.deploy.BeanProperty.bind(BeanProperty.java:648)
at io.ebeaninternal.server.persist.dml.DmlHandler.bindInternal(DmlHandler.java:226)
at io.ebeaninternal.server.persist.dml.DmlHandler.bind(DmlHandler.java:198)
at io.ebeaninternal.server.persist.dmlbind.BindableProperty.dmlBind(BindableProperty.java:54)
at io.ebeaninternal.server.persist.dmlbind.BindableList.dmlBind(BindableList.java:62)
at io.ebeaninternal.server.persist.dml.InsertMeta.bind(InsertMeta.java:162)
at io.ebeaninternal.server.persist.dml.InsertHandler.bind(InsertHandler.java:97)
Caused by: java.lang.IllegalStateException: No service implementation found for SpiJsonService?
at io.ebean.text.json.EJson.init(EJson.java:31)
at io.ebean.text.json.EJson.<clinit>(EJson.java:23)
at io.ebeaninternal.server.type.ScalarTypeJsonMap.formatValue(ScalarTypeJsonMap.java:166)
at io.ebeaninternal.server.type.ScalarTypeJsonMap.bind(ScalarTypeJsonMap.java:148)
at io.ebeaninternal.server.type.ScalarTypeJsonMap$Clob.bind(ScalarTypeJsonMap.java:55)
at io.ebeaninternal.server.deploy.BeanProperty.bind(BeanProperty.java:648)
at io.ebeaninternal.server.persist.dml.DmlHandler.bindInternal(DmlHandler.java:226)
at io.ebeaninternal.server.persist.dml.DmlHandler.bind(DmlHandler.java:198)
at io.ebeaninternal.server.persist.dmlbind.BindableProperty.dmlBind(BindableProperty.java:54)
at io.ebeaninternal.server.persist.dmlbind.BindableList.dmlBind(BindableList.java:62)
[INFO] [08/06/2018 16:03:23.475] [Thread-2] [CoordinatedShutdown(akka://sbt-web)] Starting coordinated
我的豆子看起来像这样:
@Entity
@Table(name = "my_table")
public class MyBean extends AManageableModel {
public static final Finder<Long, Configuration> find = new Finder<>(MyBean.class);
@Constraints.Required
public String name;
@Constraints.Required
@JsonProperty("some_property")
public String someProperty;
@DbJson
@JsonProperty("json_content")
public Map<String, Object> jsonContent;
}
当我使用以下 Json 在数据库中创建一行时,它起作用了(jsonContent
是 null
):
{
"name": "test 1",
"some_property": "some property content"
}
但是当我使用下面的 Json :
{
"name": "test 1",
"some_property": "some property content",
"json_content": {
"test":"test",
"test2":"test2"
}
}
它崩溃了(请参阅 post 的开头以获得完整的 stackTrace)。
使用 Jackson 完成序列化:
Json.fromJson(jsonData, MyBean.class);
好的,所以使用:
Map<String,String> jsonContent
而不是:
Map<String,Object> jsonContent
对我有用,所以我怀疑 "Object" 需要扩展可序列化的东西。
编辑:
所以,2 年后我不得不使用 Map<String,Object> jsonContent
出于不相关的原因,同样的问题又回来了。这是一个肮脏的解决方案,在应用程序启动时调用它:
try {
EJson.write(new Object());
} catch (IOException e1) {
e1.printStackTrace();
}
这会强制 EJson
加载,问题就消失了....但是该死的脏了。