je veux construire un service RESTful avec Spring et Hibernate (et Maven). J'ai d'abord utilisé la version 4.0.3 de Spring et tout fonctionne. Mais je voulais utiliser la dernière version 4.1.0 et changé mon pom.xml en conséquence. Mais je reçois une erreur au démarrage. Pouvez-vous dire à quoi devrait ressembler le pom.xml? Quelle est la meilleure façon de créer un service RESTful avec Spring? J'ai trouvé un exemple qui utilise le ressort-data-rest-webmvc et je travaille avec cela. Y a-t-il une meilleure façon?
Voici le code d'erreur:
AM org.Apache.catalina.core.StandardContext loadOnStartup
Schwerwiegend: Servlet /spring threw load() exception
Java.lang.NoSuchMethodError:
org.springframework.expression.spel.SpelParserConfiguration.<init>
(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V
at org.springframework.context.expression.StandardBeanExpressionResolver.<init>(StandardBeanExpressionResolver.Java:98)
at org.springframework.context.support.AbstractApplicationContext.prepareBeanFactory(AbstractApplicationContext.Java:553)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:455)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.Java:658)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.Java:624)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.Java:672)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.Java:543)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.Java:484)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.Java:136)
at javax.servlet.GenericServlet.init(GenericServlet.Java:160)
at org.Apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.Java:1280)
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1193)
at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:1088)
at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:5176)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5460)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1559)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1549)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:262)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:744)
Voici mon pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.rwth-aachen.prime</groupId>
<artifactId>spring</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring Maven Webapp</name>
<url>http://maven.Apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.6.Final</version>
</dependency>
<dependency>
<groupId>org.Apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.0</version>
</dependency>
<!-- Hibernate uses slf4j for logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-Java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.Apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<finalName>spring</finalName>
</build>
<properties>
<Java-version>1.7</Java-version>
<spring.version>4.1.0.RELEASE</spring.version>
</properties>
</project>
et le rest-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="spring" />
<mvc:annotation-driven />
<bean id="dataSource" class="org.Apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/firsthibernate"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="elementDao" class="dao.ElementDaoImpl">
<constructor-arg>
<ref bean="sessionFactory" />
</constructor-arg>
</bean>
Dans mon projet actuel, j'avais:
<spring.version>4.1.2.RELEASE</spring.version>
<spring-data-mongodb.version>1.6.1.RELEASE</spring-data-mongodb.version>
Voici comment je l'ai corrigé:
J'ai exécuté dépendance mvn: arbre
[INFO] ------------------------------------------------------------------------
[INFO] Building MongoDb Facts 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ mongodb-facts ---
[INFO] com.vladmihalcea:mongodb-facts:jar:1.0-SNAPSHOT
[INFO] +- org.springframework:spring-jms:jar:4.1.2.RELEASE:compile
[INFO] | +- org.springframework:spring-aop:jar:4.1.2.RELEASE:compile
[INFO] | | \- aopalliance:aopalliance:jar:1.0:compile
[INFO] | +- org.springframework:spring-context:jar:4.1.2.RELEASE:compile
[INFO] | \- org.springframework:spring-messaging:jar:4.1.2.RELEASE:compile
...
[INFO] +- org.springframework.data:spring-data-mongodb:jar:1.6.1.RELEASE:compile
[INFO] | +- org.springframework:spring-expression:jar:4.0.7.RELEASE:compile
[INFO] | +- org.springframework.data:spring-data-commons:jar:1.9.1.RELEASE:compile
[INFO] | \- org.mongodb:mongo-Java-driver:jar:2.12.3:compile
Comme vous pouvez le voir, il existe un décalage entre les bibliothèques spring-context et spring-expression.
J'ai explicitement ajouté la dépendance Spring-expression:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
Et j'ai exclu l'expression-ressort de spring-data-mongodb:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>${spring-data-mongodb.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</exclusion>
</exclusions>
</dependency>
Et maintenant, quand je lance la dépendance mvn: arbre
--- maven-dependency-plugin:2.8:tree (default-cli) @ mongodb-facts ---
com.vladmihalcea:mongodb-facts:jar:1.0-SNAPSHOT
+- org.springframework:spring-jms:jar:4.1.2.RELEASE:compile
| +- org.springframework:spring-aop:jar:4.1.2.RELEASE:compile
| | \- aopalliance:aopalliance:jar:1.0:compile
| +- org.springframework:spring-context:jar:4.1.2.RELEASE:compile
| \- org.springframework:spring-messaging:jar:4.1.2.RELEASE:compile
+- org.springframework:spring-expression:jar:4.1.2.RELEASE:compile
+- org.springframework.data:spring-data-mongodb:jar:1.6.1.RELEASE:compile
| +- org.springframework.data:spring-data-commons:jar:1.9.1.RELEASE:compile
| \- org.mongodb:mongo-Java-driver:jar:2.12.3:compile
J'ai rencontré un problème similaire et j'ai pu le résoudre en gérant explicitement le spring-context
dépendance. L'un des modules utilisait la mauvaise version de cela. Je vois que vous avez déjà une gestion des dépendances pour cela, mais cela ne fera pas de mal de vérifier si cela est en quelque sorte remplacé par un autre projet de niveau inférieur.
essayez mvn dependency:tree > tree.txt
et vérifiez le fichier généré pour voir si une autre version de spring-context
est utilisé ailleurs dans le projet.
Je voudrais ajouter ce qui suit sur ce qui a été écrit par Vlad-Mihalcea.
1) Si vous ouvrez l'onglet Hiérarchie des dépendances dans votre Eclipse , vous obtiendrez un diagnostic pourquoi une dépendance a été choisie l'une par rapport à l'autre. onglet Hiérarchie des dépendances http://i61.tinypic.com/21kdloy.png
C'était mon problème. En raison d'un artefact interne, spring-expression 3.2.8.RELEASE a été choisi sur 4.1.6.RELEASE et mon serveur Spring Boot n'a plus démarré! Vous lisez 'omis pour conflit' .
2) L'utilisation de la balise 'exclusion' n'est PAS la seule possibilité. Vous pouvez déplacer la dépendance vers le bas du POM (dans mon cas, les utilitaires) et dans ce cas, c'est la version correcte de l'expression qui a été choisie. 3.2.8.RELEASE a été écarté au profit de 4.1.6.RELEASE.
Essayez d'ajouter cette dépendance dans votre fichier pom.xml si vous prévoyez d'utiliser la version du projet springframework => 4.1.0
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.0.RELEASE</version>
</dependency>
Il se peut que vous manquiez la configuration spring-expression..jar dans le fichier POM. ajoutez la dépendance dans le fichier pom.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>