J'ai une application Spring Boot. Il fonctionne sur 2 serveurs. Les serveurs ont la même configuration . Un de ceux-ci ça marche ... de l'autre je reçois cette exception quand je le lance
2016-04-26 08:24:17.633 ERROR [localhost-startStop-1]: Error starting Tomcat context: org.springframework.beans.factory.BeanCreationException
2016-04-26 08:24:17.903 ERROR [main]: Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:133)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:532)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.Java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:766)
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.Java:361)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:307)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1191)
at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1180)
at it.besmart.parkserver.StartServer.main(StartServer.Java:13)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:497)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.Java:54)
at Java.lang.Thread.run(Thread.Java:745)
Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
at org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.Java:99)
at org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.Java:76)
at org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.Java:457)
at org.springframework.boot.context.embedded.Tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.Java:168)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.Java:160)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.Java:130)
... 14 more
La trace de la pile continue pendant de nombreuses lignes, la plupart du temps, je rencontre des problèmes d'auto-câblage et d'injection d'activités, qui sont à l'origine du problème
Invocation of init method failed; nested exception is org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
Mais mon fichier db.properties est:
jdbc.driverClassName = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://192.168.3.240:3306/SMARTPARK?useSSL=false
jdbc.username = parkuser
jdbc.password = xxxxxxxxxxxxxxxx
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = false
hibernate.format_sql = false
La base de données est en cours d'exécution (le second serveur s'y connecte régulièrement ..) et tous les privilèges accordés aux utilisateurs et aux hôtes sont corrects.
C'est mon pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>it.besmart</groupId>
<artifactId>eparkserver</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<name>eparkserver</name>
<description>ePark server</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<Java.version>1.8</Java.version>
<start-class>it.besmart.parkserver.StartServer</start-class>
<!--
<Tomcat.version>8.0.29</Tomcat.version>
-->
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
</dependency>
<dependency>
<groupId>com.pi4j</groupId>
<artifactId>pi4j-core</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>server-copy</id>
<goals>
<goal>run</goal>
</goals>
<phase>package</phase>
<configuration>
<target>
<echo message="Push to server /home/pi/park/" />
<scp trust="yes" todir="pi:[email protected]:/home/pi/park/">
<fileset dir="${basedir}/target">
</fileset>
</scp>
</target>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.Apache.ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.9.6</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
Tous mes paramètres de veille prolongée sont dans HibernateConfiguration.class (j'ai migré cette application de Spring MVC vers Spring Boot)
@Configuration
@EnableTransactionManagement
@ComponentScan({ "it.besmart" })
@PropertySource(value = { "classpath:db.properties" })
public class HibernateConfiguration {
@Autowired
private Environment environment;
@Bean
public LocalSessionFactoryBean sessionfactory(){
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[] {"it.besmart.models"});
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return dataSource;
}
private Properties hibernateProperties() {
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
return properties;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
}
}
Je ne sais pas ce qui se passe
J'ai eu le même problème. Ajoute ça :
<dependency>
<groupId><groupId></groupId>
<artifactId><some dependency></artifactId>
<version><version></version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
Vous pouvez probablement éviter cela en modifiant le sdk de votre projet.
Dans mon projet, j’utilisais initialement Java-11-openjdk-AMD64 en tant que JDK et je rencontrais le même problème.
Après avoir transformé JDK en Java-8-Oracle cela a fonctionné.
Ajoutez un nouveau fichier sous src/main/resources avec le nom application.properties.
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.3.240:3306/SMARTPARK?useSSL=false
spring.datasource.password=xxxxxxxxxxxxxxxx
spring.datasource.username=parkuser
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.show-sql=true
Supprimez HibernateConfiguration
class & sur votre annotation @EnableTransactionManagement
de la classe Main.
1) Lorsque vous utilisez Spring Boot, vous ne devez pas inclure directement les autres dépendances Spring, mais vous fier à la gestion des dépendances de Boot. Lorsque vous utilisez les "démarreurs" fournis, vous pouvez être sûr que toutes les bibliothèques nécessaires seront incluses dans une version correspondante. Documentation: https://spring.io/guides/gs/spring-boot/#use-maven
2) Le guide de planification n'est pas une application Web, vous avez donc probablement des traces de moisissure dans votre pom.xml du guide REST?
Un "bon" pom aurait "spring-boot-starter-web" (pour plus de commodité) ou bien toutes les dépendances incluses dans le démarreur énumérées individuellement. Il suffit de vérifier que vous les avez. Assurez-vous également d'inclure une @EnableAutoConfiguration dans votre SpringApplication. Ajoutez les classes à exécuter dans un tableau Object à la méthode d'exécution de SpringApplication: SpringApplication.run (new Object [] {Application.class, ScheduledTasks.class}, args);
Prendre plaisir :)
Probablement qu'il s'agit du conflit servlet.jar entre 'starter-web' et Tomcat intégré, utilisez plutôt le code suivant.
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.4.RELEASE</version>