Masalah ketergantungan setelah menambahkan proyek sampel spring-data-rest ke gs-rest-service

Saya sedang bereksperimen Layanan Web RESTful dengan Spring, proyek awal saya adalah gs-rest-service< Spring /a>. Proyek ini berfungsi dengan baik, ketika saya menekan http://localhost:8080/greeting saya mendapatkan {"id":1,"content":"Hello, World!"}.

Masalahnya adalah ketika saya menambahkan dependensi ke spring-data-rest-core dan spring-data-rest-webmvc di pom.xml saya, aplikasi tidak berfungsi lagi. Ketika saya menekan http://localhost:8080/greeting saya mendapatkan kesalahan berikut:

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

Ketika saya menghapus dependensi, aplikasi berfungsi dengan baik kembali, apa yang menyebabkan masalah ini? Ini pom.xml saya:

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


Jawaban (3)


Anda membuat segalanya menjadi rumit dalam dependensi dan konfigurasi Anda. Seperti yang telah disebutkan oleh @OliverGierke, gunakan starter berikut alih-alih dependensi individual.

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

Anda juga sudah menggunakan spring-boot-starter-parent jadi Anda tidak memerlukan versi boot musim semi dan beberapa properti tambahan yang Anda konfigurasikan. Daripada jdk.version gunakan java.version dan itu saja. Meninggalkan Anda dengan pom berikut. (Yang juga menambahkan plugin 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>

Ini akan membuat toples yang dapat dieksekusi yang dapat Anda jalankan dengan java -jar <your-jar-name-here>.jar. Ini juga harus memiliki semua dependensi yang Anda butuhkan termasuk jackson untuk JSON Anda (tidak) marshalling, ini adalah dependensi spring-boot-starter-web.

Spring Boot dengan @EnableAutoConfiguration akan mendeteksi Spring MVC dan Jackson dan melakukan konfigurasi yang tepat untuknya. Hal yang sama untuk REST Data Musim Semi. ANDA tidak perlu dipusingkan dengan xml (atau arsip perang) sendiri.

Saya menghapus Jetty jika Anda ingin menggunakannya, periksa Spring Boot panduan referensi tentang cara melakukan hal ini.

person M. Deinum    schedule 13.08.2014

Spring Boot mengirimkan starter khusus untuk 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
Ketika saya menambahkan ketergantungan ini, saya memiliki 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. Sepertinya saya masih harus menambahkan dependensi ke Jackson seperti di bawah ini! - person bachr; 13.08.2014
comment
Sepertinya Anda memiliki beberapa versi yang tidak cocok karena kelas yang Anda sebutkan hanya memiliki ketergantungan pada com.jackson. Bisakah Anda memposting seluruh stacktrace? (Dan lihat juga jawaban saya). - person M. Deinum; 13.08.2014

Ternyata saya harus menambahkan dependensi ke 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>

Dan deklarasikan kacang berikut seperti yang dijelaskan di sini 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>

Lalu, tambahkan beans.xml ke Application.java dengan @ImportResource("beans.xml").

person bachr    schedule 12.08.2014
comment
Saya sarankan mengikuti saran yang dibuat oleh jawaban pertama. Tambahkan starter dan gunakan fitur konfigurasi otomatis spring boots untuk mendeteksi Spring Data REST dan biarkan dikonfigurasi sendiri. - person M. Deinum; 13.08.2014
comment
@EnableAutoConfiguration sudah ditambahkan seperti pada proyek gs-rest-service asli. - person bachr; 13.08.2014
comment
Maka Anda tidak memerlukan AnnotationMethodHandlerAdapter yang juga sudah tidak digunakan lagi dan diganti dengan RequestMethodHandlerAdapter yang didaftarkan secara otomatis oleh @EnableWebMvc yang diaktifkan secara default jika booting pegas mendeteksi Sprnig MVC. Jackson dikonfigurasi secara otomatis jika terdeteksi, jadi pada dasarnya semua yang Anda lakukan tidak diperlukan. (Anda juga mungkin ingin menggunakan jackson2 yang dependensinya sudah dikonfigurasi oleh Spring Boot). - person M. Deinum; 13.08.2014