2017-02-12 26 views
0

В настоящее время я работаю над тем, как MongoDB настроен на моем сервере платформы java play и JPA. Сейчас я имею ошибку при котором любая функция помечается @Transactional получает эту ошибку:Конфигурирование спящего режима с помощью Mongodb «Пробовал удалить EntityManager, но ни один из них не был установлен»

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[CompletionException: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set.]] 
     at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:293) 
     at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:220) 
     at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
     at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
     at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:100) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) 
     at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:346) 
     at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:345) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
Caused by: java.util.concurrent.CompletionException: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set. 
     at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:292) 
     at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:308) 
     at java.util.concurrent.CompletableFuture.uniApply(CompletableFuture.java:593) 
     at java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:577) 
     at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474) 
     at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:1977) 
     at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:21) 
     at scala.concurrent.java8.FuturesConvertersImpl$CF.apply(FutureConvertersImpl.scala:18) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 
     at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:63) 
Caused by: java.lang.IllegalStateException: Tried to remove the EntityManager, but none was set. 
     at play.db.jpa.JPAEntityManagerContext.pop(JPAEntityManagerContext.java:74) 
     at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:155) 
     at play.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:195) 
     at play.db.jpa.TransactionalAction.call(TransactionalAction.java:25) 
     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108) 
     at play.core.j.JavaAction$$anonfun$7.apply(JavaAction.scala:108) 
     at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) 
     at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) 
     at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56) 
     at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) 

Эта ошибка происходит, если и только если мой метод имеет @Transactional на нем.

я добавил правильные зависимости для build.sbt:

libraryDependencies += javaJpa 
libraryDependencies += "org.hibernate.ogm" % "hibernate-ogm-core" % "5.0.0.Final" 
libraryDependencies += "org.hibernate.ogm" % "hibernate-ogm-mongodb" % "5.0.0.Final" 

И я настроил конф/META-INF/persitence.xml:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
      version="2.1"> 
    <persistence-unit name="defaultPersistenceUnit" transaction-type="JTA"> 
     <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider> 
     <non-jta-data-source>DefaultDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.ogm.datastore.provider" 
        value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/> 
      <property name="hibernate.ogm.datastore.host" value="127.0.0.1"/> 
      <property name="hibernate.ogm.datastore.port" value="27017"/> 
      <property name="hibernate.ogm.datastore.database" value="[DB name here]"/> 
      <property name="hibernate.ogm.datastore.safe" value="true"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

и установить мой блок ПЕРСИСТЕНТНОСТЬ по умолчанию в конф/application.conf:

jpa.default=defaultPersistenceUnit 

Вот мой метод выборки:

@Transactional() 
public Result put() { 
    Test tmp = play.libs.Json.fromJson(request().body().asJson(), Test.class); 
    JPA.em().persist(tmp); 
    return ok(play.libs.Json.toJson(tmp)); 
} 

ответ

0

Ну, проведя недели на этом, я чувствую себя глупо. Проблема заключалась в том, что тип транзакции должен быть локальным ресурсом:

<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL">