在 Spring Boot 中使用 PostgreSQL 驱动程序创建数据源时出现异常

Posted

技术标签:

【中文标题】在 Spring Boot 中使用 PostgreSQL 驱动程序创建数据源时出现异常【英文标题】:Exception when creating datasource with PostgreSQL driver in Spring Boot 【发布时间】:2019-05-13 11:15:29 【问题描述】:

我正在尝试使用 MKyong's example 之后的 Spring Boot 创建非 Web 应用程序,但出现以下错误:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.5.RELEASE)

(...) Several not relevant INFO log lines

2018-12-12 11:45:29.420 ERROR 30866 --- [ main] com.zaxxer.hikari.HikariConfig           : Failed to load driver class org.postgresql.Driver from HikariConfig class classloader sun.misc.Launcher$AppClassLoader@18b4aac2
2018-12-12 11:45:29.423  WARN 30866 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'ldConfiguration': Could not bind properties to 'LdConfiguration' : prefix=datasources.ld, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'datasources.ld' to es.ortoplus.LdConfiguration$$EnhancerBySpringCGLIB$$625f0f64
2018-12-12 11:45:29.435  INFO 30866 --- [ main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2018-12-12 11:45:29.440 ERROR 30866 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'datasources.ld' to es.oplus.LdConfiguration$$EnhancerBySpringCGLIB$$625f0f64:

    Property: datasources.ld.driverclassname
    Value: org.postgresql.Driver
    Origin: class path resource [application.yml]:3:22
    Reason: Failed to load driver class org.postgresql.Driver in either of HikariConfig class loader or Thread context classloader

Action:

Update your application's configuration

我的 conf 文件 (application.yml) 是

datasources:
  ld:
    driverClassName: org.postgresql.Driver
    jdbc-url: jdbc:postgresql://localhost:5432/oplus
    username: user123
    password: 123456
    connection-test-query: SELECT 1

在我的 Maven pom.xml 文件中我添加了:

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <!--<version> (managed by Spring Boot)42.2.5 </version> -->
</dependency>

我的入口点类:

@SpringBootApplication
public class App implements CommandLineRunner 

    @Autowired private UsuarioRepository usuarioRep;
    @Override
    public void run(String... args) throws Exception 
        App app = new App();
        System.out.printf("Users: %1d", app.usuarioRep.count());

    

    public static void main(String[] args) throws ClassNotFoundException 
        //Class.forName("org.postgresql.Driver");
        SpringApplication.run(App.class, args);

    


如您所见,我尝试检查该类是否已在类路径中。如果我取消注释该行,我得到一个 ClassNotFoundException,所以似乎错误是因为 Maven 不包含依赖项而引起的。我尝试将范围设置为runtime,但还是失败了。

无论如何,这是我的配置类:

@Configuration
@ConfigurationProperties(prefix = "datasources.ld")
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "postgreEntityManagerFactory", transactionManagerRef = "postgreTransactionManager",
        basePackages = "es.plus.l.dao")
public class LdConfiguration extends HikariConfig 

    @Bean(name = "postgreDataSource")
    @Primary
    public DataSource dataSource() 
        return new HikariDataSource(this);
    

    @Bean(name = "postgreEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean postgreEntityManagerFactory(
            final EntityManagerFactoryBuilder builder,
            @Qualifier("postgreDataSource") final DataSource dataSource) 
        final LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setJpaVendorAdapter(this.vendorAdaptor());
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
        entityManagerFactoryBean.setPersistenceUnitName("postgre");
        entityManagerFactoryBean.setPackagesToScan("es.oplus.ld.model");
        entityManagerFactoryBean.setJpaProperties(this.jpaHibernateProperties());
        entityManagerFactoryBean.afterPropertiesSet();
        return entityManagerFactoryBean;
    

    @Bean(name = "postgreTransactionManager")
    @Primary
    public PlatformTransactionManager postgreTransactionManager(
          @Qualifier("postgreEntityManagerFactory") final EntityManagerFactory emf) 
        return new JpaTransactionManager(emf);
    

    private HibernateJpaVendorAdapter vendorAdaptor() 
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        // put all the adapter properties here, such as show sql
        return vendorAdapter;
    

    private Properties jpaHibernateProperties() 
        final Properties properties = new Properties();
        // put all required jpa propeties here
        return properties;
    


【问题讨论】:

见***.com/questions/50213381/… 尝试重写您的 application.yml 以具有此结构:spring:datasource:id: 并在此属性之后,如 jdbcUrl 和 driverClassName .. 并尝试添加此依赖项: org.springframework.bootspring-boot-starter-jdbc @vanillaSugar 我有 spring-boot-starter-jpa(它添加了 jdbc 依赖项),我尝试了 camelCase 方法,但我得到了同样的错误。 找到根本原因,无论如何感谢 cmets 嗨@PabloLozano 根本原因是什么?我得到了同样的错误 【参考方案1】:

我发现了问题:Eclipse 正确显示了依赖关系,但似乎该类并不真正存在,我尝试手动运行它,所以当我执行时:

mvn clean install

我从 Maven 收到此错误

error reading /home/pablo/.m2/repository/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar; invalid LOC header (bad signature)

所以错误是由 Maven 下载损坏的 jar 版本引起的。

删除它以强制重新下载解决了该问题。

【讨论】:

【参考方案2】:

在 pom.xml 中添加下一个代码:

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <scope>runtime</scope>
    </dependency>

【讨论】:

以上是关于在 Spring Boot 中使用 PostgreSQL 驱动程序创建数据源时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot实战12:Spring Boot中使用JavaMailSender发送邮件

Spring Boot:在Spring Boot中使用Mysql和JPA

在 spring-boot 项目中使用 spring mvc xml 项目

Spring boot在Spring boot中Redis的使用

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

如何在 Spring Boot 中使用 @Transactional 注解