Java 在 Spring Boot 中使用 PostgreSQL 驱动程序创建数据源时出现异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/53741514/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Exception when creating datasource with PostgreSQL driver in Spring Boot
提问by Pablo Lozano
I'm trying to create a non-web application using Spring Boot following a MKyong's example, but I got the following error:
我正在尝试按照Mkyong 的示例使用 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$5f0f64
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$5f0f64:
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
My conf file (application.yml) is
我的 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
And in my Maven pom.xml file I added:
在我的 Maven pom.xml 文件中,我添加了:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!--<version> (managed by Spring Boot)42.2.5 </version> -->
</dependency>
My entry point class:
我的入口点类:
@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);
}
}
As you can see, I've tried to check if the class is already in the classpath. If I uncomment that line I got a ClassNotFoundException, so it seems the error is caused because Maven is not including the dependency. I've tried to set the scope as runtime
, but it fails anyway.
如您所见,我已尝试检查该类是否已在类路径中。如果我取消注释该行,我会收到 ClassNotFoundException,因此错误似乎是由于 Maven 不包含依赖项而引起的。我试图将范围设置为runtime
,但无论如何它都失败了。
Anyway, here is my Configuration class:
无论如何,这是我的配置类:
@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;
}
}
采纳答案by Pablo Lozano
I found the problem: Eclipse showed the dependencies properly, but as it seemed the class was not really present, I tried to run it manually, so when I executed:
我发现了问题:Eclipse 正确显示了依赖项,但由于该类似乎并不真正存在,因此我尝试手动运行它,因此当我执行时:
mvn clean install
I got this error from Maven
我从 Maven 得到这个错误
error reading /home/pablo/.m2/repository/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar; invalid LOC header (bad signature)
So the error was caused by Maven downloading a corrupt version of the jar.
所以这个错误是由 Maven 下载了损坏的 jar 版本引起的。
Deleting it to force a new download fixed the issue.
删除它以强制进行新下载修复了该问题。