Ebean 'Не найдена реализация сервиса для SpiJsonService' при попытке сохранить Json в БД

0

Я пытаюсь сохранить часть модели как Json в моей БД. Предполагается, что у Ebean есть этот помощник:

@DbJson
public Map<String, Object> jsonContent;

Но когда я пытаюсь сохранить свой bean-компонент, он работает только в том случае, если я не даю ему поле jsonContent. Как только я попытаюсь установить его, я получаю следующую ошибку:

play.api.http.HttpErrorHandlerExceptions$$anon$1: 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$2.applyOrElse(AkkaHttpServer.scala:343)
    at play.core.server.AkkaHttpServer$$anonfun$2.applyOrElse(AkkaHttpServer.scala:341)
    at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:414)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(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$1(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"
  }
}

он падает (см. начало сообщения для полного stackTrace).

Сериализация выполняется с использованием Джексона:

Json.fromJson(jsonData, MyBean.class);
  • 0
    В общем, если на ваш вопрос не ответили, а ошибка / проблема изменились, лучше всего ее прозрачно переписать. Добавлять обновления при запуске не имеет смысла, поскольку большинство читателей не увидят оригинал, а тот факт, что он был обновлен, добавит путаницы (в чем была проблема раньше?). Если вы хотите, чтобы читатели увидели исходную проблему, поместите «обновить» или «отредактировать» в качестве заголовка внизу и добавьте после этого новый контент (таким образом, все будет в правильном хронологическом порядке). Читатели, как правило, не обращаются к истории редактирования, чтобы увидеть предыдущие версии.
  • 0
    Вы выяснили проблему? У меня такая же ошибка :(
Показать ещё 3 комментария
Теги:
ebean

1 ответ

0

Хорошо, поэтому используйте:

Map<String,String> jsonContent

вместо:

Map<String,Object> jsonContent

работает для меня, поэтому я подозреваю, что "Object" должен расширять то, что сериализуется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню