2017-02-14 1 views
5

JPA 저장소와 Hibernate를 가진 간단한 Hello World Spring 부트 애플리케이션이있다.Hibernate JPA로 스프링 부트 애플리케이션을 시작할 때 NoSuchMethodError

... 
<properties> 
    <springframework.version>1.5.1.RELEASE</springframework.version> 
    <validation-api.version>1.1.0.Final</validation-api.version> 
    <dbunit.version>2.5.3</dbunit.version> 
    <usertype.core.version>6.0.1.GA</usertype.core.version> 
    <validate.version>2.2.0</validate.version> 
    <strman.version>0.2.0</strman.version> 
    <reflections.version>0.9.10</reflections.version> 
    <javax.servlet.jsp-api.version>2.3.1</javax.servlet.jsp-api.version> 
    <rest-assured.version>3.0.1</rest-assured.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <!-- Import dependency management from Spring Boot --> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-dependencies</artifactId> 
      <version>${springframework.version}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<repositories> 
    <repository> 
     <id>spring-milestone</id> 
     <url>https://repo.spring.io/libs-release</url> 
    </repository> 
</repositories> 

<pluginRepositories> 
    <pluginRepository> 
     <id>spring-milestone</id> 
     <url>https://repo.spring.io/libs-release</url> 
    </pluginRepository> 
</pluginRepositories> 

<dependencies> 
    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <!-- We use Logback for logging. --> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-logging</artifactId> 
      </exclusion> 
      <exclusion> 
       <!-- We use Jetty because it is cooler ;) --> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-freemarker</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-jetty</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-websocket</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-messaging</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-devtools</artifactId> 
     <optional>true</optional> 
    </dependency> 

    <!-- JSON --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jdk8</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-joda</artifactId> 
    </dependency> 

    <!-- Logging --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
    </dependency> 

    <!-- Hibernate --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
    </dependency> 

    <!-- jsr303 validation --> 
    <dependency> 
     <groupId>javax.validation</groupId> 
     <artifactId>validation-api</artifactId> 
     <version>${validation-api.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-validator</artifactId> 
    </dependency> 

    <!-- Joda-Time --> 
    <dependency> 
     <groupId>joda-time</groupId> 
     <artifactId>joda-time</artifactId> 
    </dependency> 

    <!-- To map JodaTime with database type --> 
    <dependency> 
     <groupId>org.jadira.usertype</groupId> 
     <artifactId>usertype.core</artifactId> 
     <version>${usertype.core.version}</version> 
    </dependency> 

    <!-- MySQL --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>de.weltraumschaf.commons</groupId> 
     <artifactId>validate</artifactId> 
     <version>${validate.version}</version> 
    </dependency> 

    <!-- String utility --> 
    <dependency> 
     <groupId>com.shekhargulati</groupId> 
     <artifactId>strman</artifactId> 
     <version>${strman.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.reflections</groupId> 
     <artifactId>reflections</artifactId> 
     <version>${reflections.version}</version> 
    </dependency> 

    <!-- Provided from container --> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet.jsp</groupId> 
     <artifactId>javax.servlet.jsp-api</artifactId> 
     <version>${javax.servlet.jsp-api.version}</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>jstl</artifactId> 
     <scope>provided</scope> 
    </dependency> 
</dependnecies> 
... 

데이터베이스 구성은 매우 간단 등록 정보 파일 : :이 pom.xml처럼 보이는

spring.datasource.driver-class-name = com.mysql.jdbc.Driver 
spring.datasource.url    = jdbc:mysql://localhost:3306/snafu?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8 
spring.datasource.username   = snafu 
spring.datasource.password   = *** 

spring.jpa.show-sql    = false 
spring.jpa.hibernate.format_sql = true 
spring.jpa.hibernate.ddl-auto = update 
spring.jpa.database-platform = org.hibernate.dialect.MySQLInnoDBDialect 

그리고 DB의 configclass :

package org.snafu; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaVendorAdapter; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 

import javax.sql.DataSource; 
import java.util.Properties; 

@Configuration 
@EnableJpaRepositories(basePackages = { "org.snafu.repo" }) 
public class DatabaseConfiguration { 
    @Value("${spring.datasource.driverClassName}") 
    private String driver = ""; 

    @Value("${spring.datasource.url}") 
    private String url = ""; 

    @Value("${spring.datasource.username}") 
    private String user = ""; 

    @Value("${spring.datasource.password}") 
    private String password = ""; 

    @Value("${spring.jpa.show-sql}") 
    private String showSql = ""; 

    @Value("${spring.jpa.hibernate.format_sql}") 
    private String formatSql = ""; 

    @Value(value = "${spring.jpa.hibernate.ddl-auto}") 
    private String ddlAuto; 

    @Value(value = "${spring.jpa.database-platform}") 
    private String dialect; 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan("de.iteratec.str.iteratweet.model"); 

     final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 

     return em; 
    } 

    @Bean 
    public DataSource dataSource() { 
     final DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(driver); 
     dataSource.setUrl(url); 
     dataSource.setUsername(user); 
     dataSource.setPassword(password); 
     return dataSource; 
    } 

    private Properties additionalProperties() { 
     final Properties properties = new Properties(); 
     properties.setProperty("hibernate.hbm2ddl.auto", ddlAuto); 
     properties.setProperty("hibernate.dialect", dialect); 
     properties.setProperty("hibernate.naming_strategy", "org.hibernate.cfg.EJB3NamingStrategy"); 
     return properties; 
    } 
} 

이 봄의 1.3.x 버전 자료와 함께 잘 작동. 그러나 어떤 1.4.x를 또는 1.5.x 이하 버전으로 최대 절전 모드의 자동 실패 :

java.lang.IllegalStateException: Failed to load ApplicationContext 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' 
defined in class path resource [org/snafu/DatabaseConfiguration.class]: Invocation of init method failed; 
nested exception is java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map; 
Caused by: java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map; 

은 분명히 그러한 방법이 없다. 봄 부팅으로 구성되어 최대 절전 모드 버전입니다 : 나는이 문제를 adresses 일부 봄의 문제를 발견

mvn dependency:tree | grep -i hibernate 
[INFO] | +- org.hibernate:hibernate-entitymanager:jar:5.0.11.Final:compile 
[INFO] +- org.hibernate:hibernate-core:jar:5.0.11.Final:compile 
[INFO] | +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile 
[INFO] | \- org.hibernate.common:hibernate-commons-annotations:jar:5.0.1.Final:compile 
[INFO] +- org.hibernate:hibernate-validator:jar:5.3.4.Final:compile 

. 그들은 그것이 고쳐 졌다고 주장한다. Spring 부트에서 이 아닌 픽스를 사용할 수 있습니까? 수동으로 최대 절전 모드 버전을 변경해야합니까? 나는 매우 새로운 것입니다. 스프링 부트,하지만 이것이 봄 부팅을 사용하는 이유라고 생각했습니다. 미리 정의 된대로 의 dependnecies가 toghter에서 작동합니다. 나는 무엇을 놓치거나 잘못합니까?

답변

4

스프링 부트 1.5.1.RELEASE을 사용하고 있고, pom.xml 파일에 spring-boot-starter-data-jpa 의존성이 있다고 생각하면, 스프링 - 부트는 모든 하이버 네이트 관련 jar 파일을 가져올 것이다. Spring-Boot는 다른 최대 절전 모드 병과 함께 hibernate-core-5.0.11.jar을 가져올 것이므로, hibernate-core 의존성을 pom.xml에서 제거하십시오.

당신의 오류는 당신의 pom.xml에 Jadira 버전 6.0.1.GA이 있기 때문에 발생합니다. 이 버전은 Hibernate 버전 5.0과 호환되지 않는다. 다음과 같이 pom.xml에 Jadira 버전 5.0.0.GA을 사용하십시오.

<dependency> 
     <groupId>org.jadira.usertype</groupId> 
     <artifactId>usertype.core</artifactId> 
     <version>5.0.0.GA</version> 
</dependency> 
관련 문제