J'essaie de créer une application non Web à l'aide de Spring Boot à la suite d'un l'exemple de MKyong , mais j'ai eu l'erreur suivante:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: 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
Mon fichier de conf (application.yml) est
datasources:
ld:
driverClassName: org.postgresql.Driver
jdbc-url: jdbc:postgresql://localhost:5432/oplus
username: user123
password: 123456
connection-test-query: SELECT 1
Et dans mon fichier Maven pom.xml, j'ai ajouté:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!--<version> (managed by Spring Boot)42.2.5 </version> -->
</dependency>
Ma classe de point d'entrée:
@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);
}
}
Comme vous pouvez le voir, j'ai essayé de vérifier si la classe est déjà dans le chemin de classe. Si je décommente cette ligne, j'ai une exception ClassNotFoundException, il semble donc que l'erreur soit due au fait que Maven n'inclut pas la dépendance. J'ai essayé de définir la portée comme runtime
, mais cela échoue quand même.
Quoi qu'il en soit, voici ma classe de configuration:
@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;
}
}
J'ai trouvé le problème: Eclipse a montré les dépendances correctement, mais comme il semblait que la classe n'était pas vraiment présente, j'ai essayé de l'exécuter manuellement, donc quand j'ai exécuté:
mvn clean install
J'ai reçu cette erreur de Maven
error reading /home/pablo/.m2/repository/org/postgresql/postgresql/42.2.5/postgresql-42.2.5.jar; invalid LOC header (bad signature)
L'erreur a donc été causée par le téléchargement par Maven d'une version corrompue du bocal.
Le supprimer pour forcer un nouveau téléchargement a résolu le problème.