Spring / tomcat无法加载驱动程序类:com.mysql.jdbc.driver

时间:2018-01-03 23:33:44

标签: spring spring-boot annotations inversion-of-control autowired

最近我一直在努力学习弹簧靴。我有以下相关文件:

  • @Configuration类:我用它来生成entitymanagerfactory
  • 一个@Entity类:我使用它来映射到一个mysql表实例
  • 一个@Repository crudrepository接口:这是内置于spring
  • 一个@Controller类:这用于测试自动布线(当我可以注入时,我会将其移动到服务层)
  • @SpringBootApplication类:这将运行我的应用程序
  • 一个application.properties文件
  • 一个pom.xml:这用于maven并包含mysql jar

映射到mysql表的实体类和UserRepository类(使用@Repository注释)。我试图通过@Autowire注释注入crudrepository类,但是Spring很难为它创建数据源,因为它无法找到mysql驱动程序。令我困惑的是我在maven中有mysql依赖,我在glassfish 4服务器上部署它,但是Spring正在尝试使用apache tomcat连接到数据库。下面是我的堆栈跟踪,代码片段和mysql-connector:

相关堆栈跟踪(内部异常)

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.tomcat.jdbc.pool.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.mysql.jdbc.driver
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
... 62 common frames omitted
Caused by: java.lang.IllegalStateException: Cannot load driver class: com.mysql.jdbc.driver

注意到这是如何尝试使用org.apache.tomcat创建数据源,即使我使用的是glassfish服务器。这有关系吗?

源代码:当spring尝试将作为参数的数据源bean注入此方法并且无法创建它时,会发生第一个相关异常

@Configuration
@EnableAutoConfiguration
public class AppConfigUtil {

@Autowired
@Bean 
public EntityManagerFactory entityManagerFactory(DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean(); 
    bean.setPackagesToScan("com.connor"); 
    bean.setDataSource(dataSource); 
    return bean.getObject(); 
}

maven(pom.xml)for mysql jar:

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

application.properties:这是我用于生成数据源的application.properties文件的全部内容

spring.datasource.url=jdbc:mysql://localhost:3307/craigslist
spring.datasource.username=dbadmin
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.driver
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.format_sql=true

这是我的maven依赖项的图片:mysql jar存在: downloaded maven dependencies: including mysql jar

有关如何解决这个问题的想法吗?

2 个答案:

答案 0 :(得分:0)

假设您正在使用Spring启动 这里有一些你可以做的事情来使它工作(你可能已经做了一些,我添加了任何我能想到的只是为了确保):

  • 删除你的AppConfigUtil类,因为Spring启动会&#34;神奇地&#34;如果正确配置了application.properties,请为您找到数据源。
  • @SpringBootApplication添加到ConnerApplication.java班级
  • 在您的pom中添加spring-boot-starter-data-jpa依赖

一些旁注:
@Autowire不打算用@Bean注释标记。 @Autowire可用于自动装配用@Bean注释的bean。

编辑:
我意识到OP想要在Glassfish上部署它。在这种情况下,您需要调整Spring以生成可部署的war文件,并配置应用程序容器(glassfish)以包含jdbc驱动程序。所有这些都是可行的,但需要付出很多努力 如果你将Spring-boot用于新项目,我建议你使用嵌入式tomcat方法。它基本上是战斗准备。你几乎不会出错。

答案 1 :(得分:0)

您无需在pom.xml

中声明

spring.datasource.driver-class-name=com.mysql.jdbc.driver

您可以使用Spring Boot here

在简单的应用程序中阅读我的配置

此外,如果您正在使用Spring Boot,则不需要使用代码“源代码:当spring尝试将作为参数的数据源bean注入此方法但无法创建它时,会发生第一个相关异常。 ..“