springとHibernate(およびMaven)でRESTfulサービスを構築したい。最初にSpringバージョン4.0.3を使用しましたが、すべて正常に機能します。しかし、私は最新バージョン4.1.0を使用したいと考え、それに応じてpom.xmlを変更しました。しかし、起動時にエラーが発生します。 pom.xmlがどのように見えるかを教えていただけますか? SpringでRESTfulサービスを作成する最良の方法は何ですか? spring-data-rest-webmvcを使用する例を見つけましたが、これを使用しています。もっと良い方法はありますか?
エラーコードは次のとおりです。
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)
ここに私の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>
および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>
私の現在のプロジェクトで私が持っていたのは:
<spring.version>4.1.2.RELEASE</spring.version>
<spring-data-mongodb.version>1.6.1.RELEASE</spring-data-mongodb.version>
これは私がそれを修正した方法です:
実行しましたmvndependency:tree
[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
ご覧のとおり、spring-contextライブラリとspring-expressionライブラリの間に不一致があります。
Spring-expression依存関係を明示的に追加しました。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
そして、spring-data-mongodbからspring-expressionを除外しました。
<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>
そして今、私が実行するとmvndependency:tree
--- 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
同様の問題があり、spring-context
依存関係を明示的に管理することで解決できました。モジュールの1つが間違ったバージョンを使用していました。あなたはすでにそのための依存関係管理を持っていますが、それが別の下位レベルのプロジェクトによって何らかの形でオーバーライドされているかどうかを再確認しても害はありません。
mvn dependency:tree > tree.txt
を試して、生成されたファイルをチェックして、プロジェクトの別の場所でspring-context
の別のバージョンが使用されているかどうかを確認してください。
Vlad-mihalceaによって書かれたものの上に以下を追加したいと思います。
1)EclipseのDependency Hierarchyタブを開くと、1つの依存関係が相互に選択された理由の診断が表示されます。 [依存関係の階層]タブhttp://i61.tinypic.com/21kdloy.png
それは私の問題でした。社内のアーティファクトのため、spring-expression 3.2.8.RELEASEが4.1.6.RELEASEよりも選択され、Spring Bootサーバーが起動しなくなりました! 「競合のために省略されました」と読みました。
2)タグ 'exclusion'を使用することが唯一の可能性ではありません。依存関係をPOM(私の場合はユーティリティ)に移動できます。この場合、選択されたのは正しいバージョンの式です。 3.2.8.RELEASEは、4.1.6.RELEASEを支持して破棄されました。
POMファイルにspring-expression..jar構成が欠落している可能性があります。 pomファイルに依存関係を追加します。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>