【发布时间】:2019-03-01 21:20:30
【问题描述】:
我尝试通过
的教程在我的应用程序中实现 jpa所以,我的 DataConfig 如下所示:
import org.hibernate.ejb.HibernatePersistence;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
@ComponentScan("ru.sbrf.risks.services.data")
@PropertySource("classpath:app.properties")
@EnableJpaRepositories("ru.sbrf.risks.services.data.persistence")
public class DataConfig {
private static final String PROP_DATABASE_DRIVER = "db.driver";
private static final String PROP_DATABASE_URL = "db.url";
private static final String PROP_DATABASE_USERNAME = "db.username";
private static final String PROP_HIBERNATE_DIALECT = "db.hibernate.dialect";
private static final String PROP_HIBERNATE_SHOW_SQL = "db.hibernate.show_sql";
private static final String PROP_ENTITYMANAGER_PACKAGES_TO_SCAN = "db.entitymanager.packages.to.scan";
private static final String PROP_HIBERNATE_HBM2DDL_AUTO = "db.hibernate.hbm2ddl.auto";
@Resource
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getRequiredProperty(PROP_DATABASE_DRIVER));
dataSource.setUrl(env.getRequiredProperty(PROP_DATABASE_URL));
dataSource.setUsername(env.getRequiredProperty(PROP_DATABASE_USERNAME));
dataSource.setPassword(env.getRequiredProperty("db.password"));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROP_ENTITYMANAGER_PACKAGES_TO_SCAN));
entityManagerFactoryBean.setJpaProperties(getHibernateProperties());
return entityManagerFactoryBean;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
private Properties getHibernateProperties() {
Properties properties = new Properties();
properties.put(PROP_HIBERNATE_DIALECT, env.getRequiredProperty(PROP_HIBERNATE_DIALECT));
properties.put(PROP_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROP_HIBERNATE_SHOW_SQL));
properties.put(PROP_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROP_HIBERNATE_HBM2DDL_AUTO));
return properties;
}
}
但是,当我尝试启动我的应用程序时出现错误消息。 构建战争->从嵌入式 tomcat 开始。
已连接到服务器 [2018-09-26 09:54:32,631] 未命名工件:正在部署工件,请稍候... 2018 年 9 月 26 日 09:54:34.460 警告 [RMI TCP 连接 (3)-127.0.0.1] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = LanitBPM 属性 maxActive 在 DBCP2 中没有使用,使用 maxTotal 反而。 maxTotal 默认值为 8。您已将值设置为“3” “maxActive”属性,被忽略。 2018 年 9 月 26 日 09:54:34.587 信息 [RMI TCP 连接 (3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个 JAR 已扫描 TLD,但未包含 TLD。为此启用调试日志记录 记录器以获取已扫描但没有 TLD 的 JAR 的完整列表 在他们身上找到。在扫描期间跳过不需要的 JAR 可以改善 启动时间和 JSP 编译时间。 2018 年 9 月 26 日 09:54:34.814 信息 [RMI TCP 连接(3)-127.0.0.1] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext:初始化于 2018 年 9 月 26 日开始 09:54:34.873 信息 [RMI TCP 连接 (3)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.prepareRefresh 刷新 Root WebApplicationContext:启动日期 [9 月 26 日星期三 09:54:34 MSK 2018];上下文层次结构的根 26-Sep-2018 09:54:35.051 信息 [RMI TCP 连接 (3)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions 注册带注释的类:[class ru.sbrf.risks.services.data.service.config.ServiceConfig,类 ru.sbrf.risks.services.data.persistence.config.DataConfig,类 ru.sbrf.risks.services.data.web.config.WebConfig] 2018 年 9 月 26 日 09:54:35.583 警告 [RMI TCP 连接 (3)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refresh 上下文初始化期间遇到异常 - 取消 刷新尝试: org.springframework.beans.factory.BeanDefinitionStoreException:失败 解析配置类 [ru.sbrf.risks.services.data.persistence.config.DataConfig];嵌套的 异常是 java.lang.IllegalStateException: 无法自省 类上的注释方法 ru.sbrf.risks.services.data.persistence.config.DataConfig 2018 年 9 月 26 日 09:54:35.596 严重 [RMI TCP 连接 (3)-127.0.0.1] org.springframework.web.context.ContextLoader.initWebApplicationContext 上下文初始化失败 org.springframework.beans.factory.BeanDefinitionStoreException:失败 解析配置类 [ru.sbrf.risks.services.data.persistence.config.DataConfig];嵌套的 异常是 java.lang.IllegalStateException: 无法自省 类上的注释方法 ru.sbrf.risks.services.data.persistence.config.DataConfig 在 org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181) ...引起:java.lang.IllegalStateException:无法自省 类上的注释方法 ru.sbrf.risks.services.data.persistence.config.DataConfig 在 org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:163) 在 org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:380) 在 org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314) 在 org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245) 在 org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198) 在 org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167) ... 54 更多 [2018-09-26 09:54:35,640] 工件未命名:期间出错 工件部署。有关详细信息,请参阅服务器日志。造成的: java.lang.NoClassDefFoundError: org/springframework/orm/jpa/JpaTransactionManager 在 java.lang.Class.getDeclaredMethods0(本机方法)在 java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 在 java.lang.Class.getDeclaredMethods(Class.java:1975) 在 org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:152) ... 59 更多原因:java.lang.ClassNotFoundException: org.springframework.orm.jpa.JpaTransactionManager 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1291) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) ... 63 更多
2018 年 9 月 26 日 09:54:35.602 严重 [RMI TCP 连接 (3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal 一个或多个 侦听器无法启动。完整的详细信息将在 适当的容器日志文件 26-Sep-2018 09:54:35.603 SEVERE [RMI TCP连接(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] 由于先前的错误,启动失败 26-Sep-2018 09:54:42.439 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 部署网络 应用程序目录 [C:\java\apache-tomcat-8.5.29\webapps\manager] 2018 年 9 月 26 日 09:54:42.629 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 部署的 网络应用目录 [C:\java\apache-tomcat-8.5.29\webapps\manager] 已在 [189] 完成 毫秒
如果有更好的方法来使用 jpa 和 spring-mvc? (没有弹簧靴)
app.properties:
#DB properties:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mydb
db.username=root
db.password=111111
#Hibernate Configuration:
db.hibernate.dialect=org.hibernate.dialect.MySQLDialect
db.hibernate.show_sql=true
db.entitymanager.packages.to.scan=ru.sbrf.risks.services.data
db.hibernate.hbm2ddl.auto = create
pom.xml 是
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>MyApp</groupId>
<artifactId>MyApp</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
<spring.version>4.3.9.RELEASE</spring.version>
<spring.data>2.1.0.RELEASE</spring.data>
<swagger.version>2.7.0</swagger.version>
<hibernate.version>5.3.6.Final</hibernate.version>
</properties>
<dependencies>
<!--SPRING-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- SWAGGER-->
<!--<dependency>-->
<!--<groupId>io.springfox</groupId>-->
<!--<artifactId>springfox-swagger2</artifactId>-->
<!--<version>${swagger.version}</version>-->
<!--</dependency>-->
<!--<dependency>-->
<!--<groupId>io.springfox</groupId>-->
<!--<artifactId>springfox-swagger-ui</artifactId>-->
<!--<version>${swagger.version}</version>-->
<!--</dependency>-->
<!--DATA BASE-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.data}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!--<dependency>-->
<!--<groupId>com.fasterxml.jackson.dataformat</groupId>-->
<!--<artifactId>jackson-dataformat-xml</artifactId>-->
<!--<version>2.9.6</version>-->
<!--</dependency>-->
</dependencies>
<build>
<finalName>MyApp</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
【问题讨论】:
-
db.driver和其他属性的值是多少?而且我认为您应该将@ComponentScan("ru.sbrf.risks.services.data")更改为@ComponentScan("ru.sbrf.risks") -
@ComponentScan 正确,db.driver = com.mysql.jdbc.Driver
-
您的根本原因是:
Caused by: java.lang.NoClassDefFoundError: org/springframework/orm/jpa/JpaTransactionManager。检查您是否正确配置了依赖项(例如通过 Maven 或 Gradle)。 -
@FlorianAlbrecht 我认为,这个异常发生在 Failed to introspect annotated methods on.. 异常之后。是否可能是原因,为什么 JpaTransactionManager 未创建且未找到?
标签: spring spring-mvc spring-data-jpa