2017-03-09 9 views
0

주입하려고하면 오류가 발생합니다. 통합 예제 나는 official site에서 가져 왔습니다. 대신 "hibernate-entitymanager의 "나는 "hibernate-core"을 사용하지만, "hibernate-entitymanager" 같은 오류PlayFramework 2.5.12 JPAApi 주입 오류

버전

최대 절전 모드 코어 -.. 5.2.8

플레이 - 2.5.12

1) Error injecting constructor, java.lang.NoSuchMethodError: org.hibernate.cfg.AnnotationBinder.bindDefaults(Lorg/hibernate/boot/spi/MetadataBuildingContext;)V 
    at play.db.jpa.DefaultJPAApi$JPAApiProvider.<init>(DefaultJPAApi.java:54) 
    at play.db.jpa.DefaultJPAApi$JPAApiProvider.class(DefaultJPAApi.java:35) 
    while locating play.db.jpa.DefaultJPAApi$JPAApiProvider 
    while locating play.db.jpa.JPAApi 
    for field at controllers.api.UsersApi.jpaApi(UsersApi.java:20) 
    at controllers.api.UsersApi.class(UsersApi.java:20) 
    while locating controllers.api.UsersApi 
    for field at controllers.api.ApiFe.usersApi(ApiFe.java:34) 
    while locating controllers.api.ApiFe 
    for parameter 27 at router.Routes.<init>(Routes.scala:136) 
    while locating router.Routes 
    while locating play.api.inject.RoutesProvider 
    while locating play.api.routing.Router 
    for parameter 0 at play.api.http.JavaCompatibleHttpRequestHandler.<init>(HttpRequestHandler.scala:200) 
    while locating play.api.http.JavaCompatibleHttpRequestHandler 
    while locating play.api.http.HttpRequestHandler 
    for parameter 4 at play.api.DefaultApplication.<init>(Application.scala:221) 
    at play.api.DefaultApplication.class(Application.scala:221) 
    while locating play.api.DefaultApplication 
    while locating play.api.Application 
    for parameter 0 at play.DefaultApplication.<init>(DefaultApplication.java:30) 
    at play.DefaultApplication.class(DefaultApplication.java:30) 
    while locating play.DefaultApplication 
    while locating play.Application 

1 error] 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:180) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:131) 
    at scala.Option.map(Option.scala:146) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:131) 
    at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:129) 

application.conf

db.default.driver=com.mysql.jdbc.Driver 
db.default.url="jdbc:mysql://dev-box-2:3306/localbase?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false" 
db.default.user=test 
db.default.password=test 
db.default.bonecp.logStatements=true 
db.default.bonecp.partitionCount=10 
db.default.bonecp.maxConnectionsPerPartition=10 
db.default.bonecp.minConnectionsPerPartition=1 
db.default.bonecp.connectionTimeout=3 seconds 

db.default.jndiName=DefaultDS 
jpa.default=defaultPersistenceUnit 

의 persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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" > 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <non-jta-data-source>DefaultDS</non-jta-data-source> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

build.sbt

libraryDependencies ++= Seq(
     javaJdbc, 
     javaJpa, 
     cache, 
     javaWs, 
     "org.hibernate" % "hibernate-core" % "5.2.8.Final", 
     ... 

클래스

,691,363
@Singleton 
public class UsersApi implements Mappings { 

    @Inject 
    JPAApi jpaApi; 

    ... 
} 
+0

그래서 Play는 사용중인 Hibernate의 버전에 더 이상 존재하지 않는 Hibernate 메소드를 호출합니다. 결과적으로 Play에게 JPA API를 사용한다고 주장 할 때 독점적 인 메소드를 호출하는 이유 (여기서 그런 일은 할 필요가 없습니다) –

답변

0

(210) 내가 @의 niel - 스탁턴의 의견에 따라 경찰 "org.hibernate" % "hibernate-entitymanager" % "5.2.8.Final"

작동하는 최근의 프로젝트를 가지고, 내가 직접

package play.db.jpa; 

import play.db.DBApi; 
import play.inject.ApplicationLifecycle; 

import java.util.*; 
import java.util.concurrent.CompletableFuture; 
import java.util.function.Function; 
import java.util.function.Supplier; 

import javax.inject.Inject; 
import javax.inject.Provider; 
import javax.inject.Singleton; 
import javax.persistence.*; 

/** 
* Default implementation of the JPA API. 
*/ 
public class DefaultJPAApi implements JPAApi { 

아래는 내 현재 구성은 최대 절전 모드 사용 DefaultJPAApi 클래스에서 아무것도 볼니까. 나는

routesGenerator := InjectedRoutesGenerator 

scalaVersion := "2.11.8" 

libraryDependencies ++= Seq(
    "org.webjars" % "bootstrap" % "3.0.3", 
    javaJdbc, 
    javaJpa, 
    cache, 
    json, 
    javaWs, 
    "com.typesafe.play.modules" %% "play-modules-redis" % "2.5.0" exclude("redis.clients" ,"jedis"), 
    "redis.clients" % "jedis" % "2.9.0", 
    "org.hibernate" % "hibernate-entitymanager" % "5.2.8.Final", 
    "com.google.guava" % "guava" % "21.0", 
    "org.opensaml" % "opensaml" % "2.5.3" 
) 

application.conflocal-db.conf

application.conf에서 오라클 일치의 설정을 포함 build.sbt

DB

로 오라클을 사용하고

play.db.default = "oracle" 

Playframework 기본적으로 HikariCP를 사용하므로 configura 아래 기는 HikariCP

로컬 db.conf

evolutionplugin = disabled 

jpa { 
    default = devPersistenceUnit 
} 

db { 
    oracle { 
    # You can expose this datasource via JNDI if needed (Useful for JPA) 
    jndiName = LocalDevDS 
    # Set a connection's default autocommit setting 
    autocommit = true 
    hikaricp { 
     dataSourceClassName = oracle.jdbc.pool.OracleDataSource 

     dataSource { 
     serverName = ${DB_HOST} 
     user = ${DB_USER} 
     password = ${DB_PASS} 
     databaseName = ${DB_NAME} 
     portNumber = ${DB_PORT} 
     networkProtocol = tcp 
     driverType = thin 
     } 
     maximumPoolSize = 8 
     registerMbeans = true 
     # 15 minutes 
     maxLifetime = 450000 
     # 5 minutes 
     idleTimeout = 300000 
     connectionTimeout = 60000 
    } 
    } 
} 

local.conf 적용

include "application.conf" 
include "local-db.conf" 

plugins.sbt

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.12") 

addSbtPlugin("com.typesafe.sbt" % "sbt-twirl" % "1.1.1") 

** 지속성.XML은 **

<persistence-unit name="devPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <non-jta-data-source>LocalDevDS</non-jta-data-source> 
    <properties> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
    <property name="hibernate.hbm2ddl.auto" value="update"/> 
    <property name="hibernate.show_sql" value="true"></property> 
    <property name="hibernate.format_sql" value="true"></property> 
    </properties> 
</persistence-unit> 

당신이 BoneCP를 사용하려면 몇 가지 구성 변경이 여기에 https://www.playframework.com/documentation/2.5.x/SettingsJDBC

play.db.pool=bonecp 
play.db.prototype.bonecp.maxConnectionsPerPartition = 50 

prototype에 따라 을 필요로하는 풀 구성에 지정된 기본 이름이입니다. 아무거나 부르면 내 설정에 oracle이라고 부릅니다.

호프가 문제를 해결할 수 있기를 바랍니다.