0
votes

I'm using Play 2.5.4(coding in Java) and Hibernate 5.2.1 with JPA. I tried adding Hibernate Search but I keep receiving the following error when I enable it in build.sbt:

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.AbstractMethodError at play.db.jpa.DefaultJPAApi$JPAApiProvider.(DefaultJPAApi.java:39) at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:34) while locating play.db.jpa.DefaultJPAApi$JPAApiProvider while locating play.db.jpa.JPAApi for parameter 0 at play.db.jpa.TransactionalAction.(TransactionalAction.java:20)
while locating play.db.jpa.TransactionalAction 1 error]] at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280) at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206) 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:98) 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:344) at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70) at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) at scala.concurrent.Promise$class.complete(Promise.scala:55) at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) at scala.concurrent.Promise$class.failure(Promise.scala:104) at scala.concurrent.impl.Promise$DefaultPromise.failure(Promise.scala:153) at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:255) at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:249) at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) at akka.dispatch.BatchingExecutor$AbstractBatch.processBatch(BatchingExecutor.scala:55) at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:91) at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91) at akka.dispatch.BatchingExecutor$BlockableBatch$$anonfun$run$1.apply(BatchingExecutor.scala:91) at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72) at akka.dispatch.BatchingExecutor$BlockableBatch.run(BatchingExecutor.scala:90) at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:39) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:405) at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.AbstractMethodError at play.db.jpa.DefaultJPAApi$JPAApiProvider.(DefaultJPAApi.java:39) at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:34) while locating play.db.jpa.DefaultJPAApi$JPAApiProvider while locating play.db.jpa.JPAApi for parameter 0 at play.db.jpa.TransactionalAction.(TransactionalAction.java:20)
while locating play.db.jpa.TransactionalAction 1 error at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025) at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051) at play.api.inject.guice.GuiceInjector.instanceOf(GuiceInjectorBuilder.scala:405) at play.core.j.DefaultJavaHandlerComponents.getAction(JavaAction.scala:142) at play.core.j.JavaAction$$anonfun$6.apply(JavaAction.scala:91) at play.core.j.JavaAction$$anonfun$6.apply(JavaAction.scala:89) at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:57) at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:66) at scala.collection.mutable.ArraySeq.foldLeft(ArraySeq.scala:46) at play.core.j.JavaAction.apply(JavaAction.scala:89) at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:112) at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:112) at play.utils.Threads$.withContextClassLoader(Threads.scala:21) at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:111) at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:110) at scala.Option.map(Option.scala:146) at play.api.mvc.Action$$anonfun$apply$2.apply(Action.scala:110) at play.api.mvc.Action$$anonfun$apply$2.apply(Action.scala:103) at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251) ... 14 common frames omitted Caused by: java.lang.AbstractMethodError: null at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:275) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:483) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:888) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) at play.db.jpa.DefaultJPAApi.lambda$start$1(DefaultJPAApi.java:60) at java.lang.Iterable.forEach(Iterable.java:75) at play.db.jpa.DefaultJPAApi.start(DefaultJPAApi.java:59) at play.db.jpa.DefaultJPAApi$JPAApiProvider.(DefaultJPAApi.java:46) at play.db.jpa.DefaultJPAApi$JPAApiProvider$$FastClassByGuice$$dcd4cdbd.newInstance() at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40) at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61) at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105) at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85) at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267) at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1103) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) at com.google.inject.internal.SingletonScope$1.get(SingletonScope.java:145) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:61) at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:104) at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85) at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267) at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092) at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012) ... 32 common frames omitted

In build.sbt:

[...]
  "org.hibernate" % "hibernate-core" % "5.2.1.Final",
  "org.hibernate" % "hibernate-entitymanager" % "5.2.1.Final",
  "mysql" % "mysql-connector-java" % "5.1.36",
  //"org.hibernate" % "hibernate-search-orm" % "5.2.1.Final", -> Uncommenting this results in error
  "org.apache.lucene" % "lucene-core" % "5.3.1",
  "dom4j" % "dom4j" % "1.6"
[...]

application.conf

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/db?autoReconnect=true"
[...db info...]
db.default.jndiName = DefaultDS
jpa.default = defaultPersistenceUnit

hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost/db?autoReconnect=true</property>
    <property name="connection.username">###</property>
    <property name="connection.password">###</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>


</session-factory>
</hibernate-configuration>

persistence.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="RESOURCE_LOCAL">
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
            <non-jta-data-source>DefaultDS</non-jta-data-source>
            <properties>
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>

    </persistence-unit>
</persistence>

I can't seem to find a good tutorial on how to use Hibernate Search with Play Framework 2.5+.

Thank you!

LE:

I sloved it by using:

...
  "org.hibernate" % "hibernate-entitymanager" % "4.3.10.Final",
  "org.hibernate" % "hibernate-search-orm" % "5.3.0.Final",
...

as suggested here: https://stackoverflow.com/a/30656145/6682875

2
Could you please edit the question to add the whole stack trace?marcospereira
and while you're at it, explain what API you are using ... because if JPA then you use ONLY persistence.xml, and if Hibernate then you use hibernate.cfg.xml. It is EITHER OR, not BOTHNeil Stockton
@marcospereira Donetaviss
@NeilStockton I deleted the hibernate.cfg.xmltaviss

2 Answers

0
votes

It seems that some things are missing in your configuration. Here is an example of working configuration I used (just substituted real names). Pay attention, that there is no use of hibernate.cfg.xml.

build.sbt:

val hibernateVersion = "4.3.10.Final"
val mySqlConnectorVersion = "5.1.36"

libraryDependencies ++= Seq(
  javaJpa
)
...
libraryDependencies ++= Seq(
    ...
    "org.hibernate" % "hibernate-entitymanager" % hibernateVersion,
    "mysql" % "mysql-connector-java" % mySqlConnectorVersion
    ...

application.conf:

# ~~~~~
# MySql 5.6
db.default.driver=com.mysql.jdbc.Driver
db.default.username="user" - put here your DB user name
db.default.password="password" - put here your DB user password
dbhosts="hostip:port" - put here your host and DB port
dbschema="dbschema" - put here the exact case-sensitive name of the DB schema
dbproperties="?autoReconnect=true"
db.default.url="mysql://"${db.default.username}":"${db.default.password}"@"${dbhosts}"/"${dbschema}${dbproperties}
db.default.jndiName=MyDS
jpa.default=myDbPersistanceUnit

persistence.xml:

<persistence-unit name="myDbPersistanceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>MyDS</non-jta-data-source>
    <!--Model mapping (optional) like below-->
    <!--class>persistence.models.SomeEntityClass</class>-->
    ....
<properties>
    <!--Hibernate properties -->
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
</properties>

0
votes

I sloved it by using:

...
  "org.hibernate" % "hibernate-entitymanager" % "4.3.10.Final",
  "org.hibernate" % "hibernate-search-orm" % "5.3.0.Final",
...

as suggested here: https://stackoverflow.com/a/30656145/6682875