ปัญหาการพึ่งพาหลังจากเพิ่ม spring-data-rest ให้กับโปรเจ็กต์ตัวอย่าง gs-rest-service

ฉันกำลังทดลอง RESTful Web Services กับ Spring โปรเจ็กต์เริ่มต้นของฉันคือ gs-rest-service< ของ Spring /ก>. โปรเจ็กต์ทำงานได้ดี เมื่อฉันกด http://localhost:8080/greeting ฉันได้รับ {"id":1,"content///Hello, World!"}

ปัญหาคือเมื่อฉันเพิ่มการอ้างอิงให้กับ spring-data-rest-core และ spring-data-rest-webmvc ใน pom.xml ของฉัน แอปพลิเคชันไม่ทำงานอีกต่อไป เมื่อฉันกด 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>

person bachr    schedule 12.08.2014    source แหล่งที่มา


คำตอบ (3)


คุณกำลังทำสิ่งต่าง ๆ ให้ซับซ้อนในการขึ้นต่อกันและการกำหนดค่าของคุณ ตามที่ @OliverGierke กล่าวถึงแล้วให้ใช้ตัวเริ่มต้นต่อไปนี้แทนการพึ่งพาส่วนบุคคล

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

นอกจากนี้ คุณยังใช้ spring-boot-starter-parent อยู่แล้ว ดังนั้นคุณไม่จำเป็นต้องใช้เวอร์ชันบูทสปริง ซึ่งเป็นคุณสมบัติเพิ่มเติมบางส่วนที่คุณกำหนดค่าไว้ แทนที่จะใช้ jdk.version ให้ใช้ java.version เท่านี้ก็เรียบร้อย ทิ้งคุณไว้กับปอมต่อไปนี้ (ซึ่งเพิ่มปลั๊กอิน 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 <your-jar-name-here>.jar สิ่งนี้ควรมีการขึ้นต่อกันทั้งหมดที่คุณต้องการ รวมถึงแจ็คสันสำหรับ JSON (un)marshalling ของคุณ นี่คือการขึ้นต่อกันของ spring-boot-starter-web

Spring Boot ด้วย @EnableAutoConfiguration จะตรวจจับ Spring MVC และ Jackson และทำการกำหนดค่าที่เหมาะสม เช่นเดียวกับ Spring Data REST คุณไม่จำเป็นต้องยุ่งกับ xml (หรือไฟล์เก็บถาวรสงคราม) ด้วยตัวคุณเอง

ฉันลบ Jetty ออกแล้วหากคุณต้องการใช้ให้ตรวจสอบ Spring Boot คู่มืออ้างอิงเกี่ยวกับวิธีการทำเช่นนี้

person M. Deinum    schedule 13.08.2014

Spring Boot จัดส่งสตาร์ทเตอร์เฉพาะสำหรับ Spring Data REST:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
person Oliver Drotbohm    schedule 12.08.2014
comment
เมื่อฉันเพิ่มการพึ่งพานี้ฉันมี 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 ดูเหมือนว่าฉันยังต้องเพิ่มการพึ่งพาแจ็คสันดังต่อไปนี้! - person bachr; 13.08.2014
comment
ดูเหมือนว่าคุณมีเวอร์ชันที่ไม่ตรงกันบางเวอร์ชัน เนื่องจากคลาสที่คุณพูดถึงมีการพึ่งพา com.jackson เท่านั้น คุณสามารถโพสต์ stacktrace ทั้งหมดได้หรือไม่? (และดูคำตอบของฉันด้วย) - person M. Deinum; 13.08.2014

ปรากฎว่าฉันต้องเพิ่มการพึ่งพาให้กับแจ็คสัน:

<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>

และประกาศ bean ต่อไปนี้ตามที่อธิบายไว้ที่นี่ Spring MVC - HttpMediaTypeNotAcceptableException:

<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>

จากนั้น เพิ่ม beans.xml ไปที่ Application.java ด้วย @ImportResource("beans.xml")

person bachr    schedule 12.08.2014
comment
ฉันขอแนะนำให้ทำตามคำแนะนำที่ทำโดยคำตอบแรก เพิ่มสตาร์ทเตอร์และใช้คุณสมบัติกำหนดค่าอัตโนมัติของสปริงบูทเพื่อตรวจจับ Spring Data REST และปล่อยให้กำหนดค่าเอง - person M. Deinum; 13.08.2014
comment
@EnableAutoConfiguration ถูกเพิ่มแล้วเหมือนกับในโปรเจ็กต์ gs-rest-service ดั้งเดิม - person bachr; 13.08.2014
comment
จากนั้นคุณไม่จำเป็นต้องใช้ AnnotationMethodHandlerAdapter ซึ่งเลิกใช้แล้วและแทนที่ด้วย RequestMethodHandlerAdapter ซึ่งลงทะเบียนโดยอัตโนมัติโดย @EnableWebMvc ซึ่งเปิดใช้งานตามค่าเริ่มต้นหาก spring boot ตรวจพบ Sprnig MVC แจ็กสันจะได้รับการกำหนดค่าอัตโนมัติหากตรวจพบ ดังนั้นโดยพื้นฐานแล้วสิ่งที่คุณทำทั้งหมดจึงไม่จำเป็น (นอกจากนี้คุณอาจต้องการใช้ jackson2 ซึ่ง Spring Boot ได้กำหนดค่าการพึ่งพาไว้แล้ว) - person M. Deinum; 13.08.2014