【问题标题】:Dependency issue after adding spring-data-rest to gs-rest-service sample project将 spring-data-rest 添加到 gs-rest-service 示例项目后的依赖问题
【发布时间】:2014-10-05 09:48:51
【问题描述】:

我正在用 Spring 试验 RESTful Web 服务,我的起始项目是 Spring 的 gs-rest-service。该项目运行良好,当我点击 http://localhost:8080/greeting 时,我得到 {"id":1,"content":"Hello, World!"}。

问题是当我在pom.xml 中添加对spring-data-rest-corespring-data-rest-webmvc 的依赖项时,应用程序不再工作。当我点击http://localhost:8080/greeting 时,出现以下错误:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Tue Aug 12 12:27:28 CEST 2014
There was an unexpected error (type=Not Acceptable, status=406).
Could not find acceptable representation

当我删除依赖项时,应用程序再次正常工作,是什么导致了这个问题? 这是我的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>org.springframework</groupId>
<artifactId>gs-rest-service</artifactId>
<version>0.1.0</version>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.5.RELEASE</version>
</parent>

<packaging>war</packaging>

<properties>
    <spring.version>4.0.5.RELEASE</spring.version>
    <spring.boot.version>1.1.4.RELEASE</spring.boot.version>
    <jdk.version>1.7</jdk.version>
    <jetty.version>8.1.8.v20121106</jetty.version>
    <spring.data.rest.version>2.1.2.RELEASE</spring.data.rest.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring.boot.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-rest-core</artifactId>
        <version>${spring.data.rest.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-rest-webmvc</artifactId>
        <version>${spring.data.rest.version}</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>${jdk.version}</source>
                <target>${jdk.version}</target>
            </configuration>
        </plugin>

        <plugin>                
            <groupId>org.mortbay.jetty</groupId>                
            <artifactId>jetty-maven-plugin</artifactId>             
            <version>${jetty.version}</version>             
        </plugin>
    </plugins>
</build>
</project>

【问题讨论】:

    标签: java maven spring-mvc spring-boot spring-data-rest


    【解决方案1】:

    您正在使依赖项和配置变得复杂。正如@OliverGierke 已经提到的那样,使用以下启动器而不是单个依赖项。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>
    

    另外你已经在使用spring-boot-starter-parent 所以你不需要spring boot 版本是你配置的一些附加属性。而不是jdk.version 使用java.version,仅此而已。给你留下以下pom。 (其中还添加了 spring-boot 插件)。

    <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>org.springframework</groupId>
        <artifactId>gs-rest-service</artifactId>
        <version>0.1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.1.5.RELEASE</version>
        </parent>
    
        <packaging>jar</packaging>
    
        <properties>
            <java.version>1.7</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</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-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    这将创建一个可执行的 jar,您可以使用 java -jar &lt;your-jar-name-here&gt;.jar 运行它。这还应该具有您需要的所有依赖项,包括用于 JSON(un)编组的 jackson,这是 spring-boot-starter-web 的依赖项。

    带有@EnableAutoConfiguration 的Spring Boot 将检测Spring MVC 和Jackson 并为其进行适当的配置。 Spring Data REST 也是如此。你不应该自己弄乱 xml(或战争档案)。

    如果你想使用 Jetty,我删除了它,请查看 Spring Boot reference guide 了解如何执行此操作。

    【讨论】:

      【解决方案2】:

      Spring Boot 为 Spring Data REST 提供了一个专用的启动器:

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
      </dependency>
      

      【讨论】:

      • 当我添加这个依赖时,我有一个Could not autowire field: private final java.util.List org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration.converters; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonProcessingException。听起来我仍然需要向 Jackson 添加依赖项,如下所示!
      • 看起来你有一些不匹配的版本,因为你提到的类只依赖于com.jackson。您可以发布整个堆栈跟踪吗? (另见我的回答)。
      【解决方案3】:

      原来我得给Jackson添加依赖:

      <dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-core-asl</artifactId>
          <version>1.9.13</version>
      </dependency>
      <dependency>
          <groupId>org.codehaus.jackson</groupId>
          <artifactId>jackson-mapper-asl</artifactId>
          <version>1.9.13</version>
      </dependency>
      

      并按照此处Spring MVC - HttpMediaTypeNotAcceptableException 的描述声明以下bean:

      <context:annotation-config/>
      
      <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
      </bean>
      <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
          <property name="messageConverters">
              <list>
                  <ref bean="jacksonMessageConverter"/>
              </list>
          </property>
      </bean>
      

      然后,使用@ImportResource("beans.xml") 将 beans.xml 添加到 Application.java

      【讨论】:

      • 我建议遵循第一个答案的建议。添加启动器并使用 spring boots 自动配置功能来检测 Spring Data REST 并让它自行配置。
      • @EnableAutoConfiguration 已添加到原始 gs-rest-service 项目中。
      • 那么你不需要AnnotationMethodHandlerAdapter,它也被RequestMethodHandlerAdapter自动注册,如果spring boot检测到Sprnig MVC,则默认启用RequestMethodHandlerAdapter。如果检测到杰克逊是自动配置的,所以基本上不需要你所做的一切。 (你可能还想使用 Spring Boot 已经为其配置了依赖项的 jackson2)。
      猜你喜欢
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2017-03-19
      • 1970-01-01
      • 2023-03-27
      • 2017-07-25
      相关资源
      最近更新 更多