【问题标题】:Tomcat 8 + MySQL + Spring + JPA - Cannot create JDBC driver of class '' for connect URL 'null'Tomcat 8 + MySQL + Spring + JPA - 无法为连接 URL 'null' 创建类 '' 的 JDBC 驱动程序
【发布时间】:2015-05-03 01:02:00
【问题描述】:

我知道这个问题之前已经被问过多次,所以我很抱歉再次问,但是,我已经尝试了所有其他建议的修复方法,但仍然无法解决这个问题。

我正在尝试创建一个使用 MySQL 数据库、Tomcat 8、JNDI 数据源、Spring 和 JPA 的简单 Web 应用程序,但在部署时出现以下错误:

Cannot create JDBC driver of class '' for connect URL 'null'
java.sql.SQLException: No suitable driver
    at java.sql.DriverManager.getDriver(DriverManager.java:315)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2049)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:1939)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1412)
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcServicesImpl.java:279)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:124)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at org.springframework.orm.jpa.LocalEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalEntityManagerFactoryBean.java:96)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:634)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:444)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:299)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:129)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1469)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:949)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)

这是我的配置:

content.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource 
    name="jdbc/testapp" 
    auth="Container" 
    type="javax.sql.DataSource"
    maxTotal="100" 
    maxIdle="30" 
    maxWaitMillis="10000"
    username="test" 
    password="password123" 
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test"/>  
</Context>

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" version="2.1"
 xsi:schemaLocation="http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd">

    <persistence-unit name="org.iainadams.testappdb" transaction-type="RESOURCE_LOCAL">
        <description>Default MySQL database</description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:comp/env/jdbc/testapp</jta-data-source>
         <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
      </properties>
    </persistence-unit>

 </persistence>

web.xml

....
<resource-ref>
    <description>MySQL Database</description>
    <res-ref-name>jdbc/testapp</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
....

org.iainadams.testapp

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jndi.JndiObjectFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.LocalEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.Database;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages="org.iainadams.testapp" )
@EnableJpaRepositories("org.iainadams.testapp.repositories")
@EnableTransactionManagement
public class ApplicationConfig {

    @Bean
    public TilesConfigurer tilesConfigurer(){
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions("/WEB-INF/tiles/tiles-defs.xml");
        return tilesConfigurer;
    }

    @Bean
    public TilesViewResolver viewResolver(){
        return new TilesViewResolver();
    }

    @Bean(name="entityManagerFactory")
    public LocalEntityManagerFactoryBean entityManagerFactory(){
        LocalEntityManagerFactoryBean localEntityManagerFactory = new LocalEntityManagerFactoryBean();
        localEntityManagerFactory.setPersistenceUnitName("org.iainadams.testappdb");
        return localEntityManagerFactory;
    }

    @Bean
    public DataSource datasource(){
        JndiObjectFactoryBean datasourceLookup = new JndiObjectFactoryBean();
        datasourceLookup.setResourceRef(true);
        datasourceLookup.setJndiName("java:comp/env/jdbc/testapp");
        return (DataSource) datasourceLookup.getObject();
    }


    @Bean
    public JpaTransactionManager txManager(EntityManagerFactory emf){
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(emf);
        return txManager;
    }

}

另外,我已经将我的 MySQL 驱动 jar 文件(mysql-connector-java-5.1.34-bin.jar)放到了 apache-tomcat-8.0.18\lib 文件夹中。

任何帮助将不胜感激。

【问题讨论】:

  • 我会说文件 content.xml 没有找到,因为您已经在那里定义了属性。在实际异常发生之前,您可能会收到一些警告吗?
  • 没有警告。虽然我确实意识到它与persistence.xml 一起被部署到/WEB-INF/classes/META-INF/。我读到它需要直接在 /META-INF 下。所以我更新了我的项目配置。但是,它仍然无法正确部署。我仍然遇到同样的错误。
  • 好的.... 一些进展.... 如果我将我的 context.xml 中的 描述放在全局 context.xml 中(在 $CATALINA_HOME/conf/context.xml 下),那么有用。我认为你是对的,我的 context.xml 没有被服务器识别。
  • 另外,如果我不把它放在 tomcat 的 webapps 目录中,这也有效。如果我从不同的目录运行它,它会很好地加载。关于为什么 webapps 文件夹不起作用的任何想法?

标签: java mysql spring tomcat jpa


【解决方案1】:

a) 它应该是 java:/comp/env/jdbc/testapp(java 后面缺少斜杠)

b)我相信它必须是因为tomcat不提供jta事务(如果我错了请纠正我)

【讨论】:

    【解决方案2】:

    你可以试试这个java配置

    @Bean
    public BasicDataSource dataSource(){
           BasicDataSource basicDataSource=new BasicDataSource();
           basicDataSource.addConnectionProperty("destroy-method","close");
           basicDataSource.setDriverClassName("com.mysql.jdbc.Driver");
           basicDataSource.setUsername("root");
           basicDataSource.setUrl("jdbc:mysql://localhost/dbname");
           basicDataSource.setPassword("");
           return basicDataSource;
    }
    
    @Bean
    public AnnotationSessionFactoryBean sessionFactoryBean(){
           AnnotationSessionFactoryBean asfb=new AnnotationSessionFactoryBean();
           asfb.setDataSource(dataSource());
           asfb.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
           asfb.setHibernateProperties(hibernateProperties());
    
           return asfb;
    }
    public SessionFactory sessionFactory(){
          return sessionFactoryBean().getObject();
    }
    private Properties hibernateProperties(){
           Properties properties=new Properties();
           properties.put("dialect","org.hibernate.dialect.MySQLDialect");
    
           return properties;
     }
    

    【讨论】:

    • 感谢@LynAs。虽然我热衷于使用 JPA 和 JNDI,但如果我能让它工作的话,这确实很有帮助。
    • 使用jpa和jndi没有问题。我给了你java配置,这样你就可以更好地调试了。更改驱动程序和方言,它将与您一起使用 jndi
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2012-03-09
    • 2011-11-08
    • 2018-01-14
    • 2011-05-14
    相关资源
    最近更新 更多