2

私の問題は、Spring MVC とそれに付属する標準アノテーションを使用して Java コレクションを JSON として返したいということです。残念ながら、毎回 HTTP エラー コード 406 が表示されます。

「このリクエストによって識別されたリソースは、リクエストの「受け入れ」ヘッダーに従って受け入れられない特性を持つ応答のみを生成できます。」

Jackson と Spring は戻り値の型を自動的に変換できると思っていましたが、コレクションまたは 以外の戻り値の型を使用すると、HTTP エラー 406 が返されますString。私が間違っていることを示すのを手伝ってもらえますか?


調査
前述したように、返される文字列を取得できます。問題は Maven (Jackson との依存関係) または Spring MVC REST アノテーションの理解にあると考えています。別のルートは、Spring コンテキストを正しく構成していないことです。


コントローラー
これは、注釈付きの Spring コントローラーです。最初の単純なメソッド ( getAJsonString) は機能getImprovedJsonMapしますが、マップを使用した 2 番目のメソッド ( ) は HTTP エラー コード 406 を返します。これは、複雑な型が原因であると推測されます。

@Controller
@RequestMapping("/kfc/brands")
public class DefaultMetricsService {

    @RequestMapping(value="/firstMethod", method = RequestMethod.GET)
    public @ResponseBody String getAJsonString() {
        return "HELLO";
    }

    @RequestMapping(value = "/Metrics/type3", method = RequestMethod.GET)
    public @ResponseBody Map<String, String> getImprovedJsonMap() {
        Map jsonMap = new HashMap<String, String>();
        jsonMap.put("counter", "3000");
        return jsonMap;
    }


Spring サーブレットの定義
これは私の Spring 構成です ( metrics-servlet.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation=
           "http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">

    <context:component-scan base-package="com.t2" />

    <mvc:annotation-driven />


</beans>
...


依存関係
これは、Jackson のバージョンを使用した私の pom です。

<!-- Dependency Versions -->
    <org.slf4j.version>1.6.1</org.slf4j.version>
    <spring.version>3.2.2.RELEASE</spring.version>
    <commons.loggin.version>1.1.1</commons.loggin.version>
    <junit.version>4.8.2</junit.version>
    <jackson.version>1.9.10</jackson.version>    

 ...
        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
        <exclusions>
            <!-- Exclude Commons Logging in favor of SLF4j -->
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>${commons.loggin.version}</version>
    </dependency>

    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <!-- Jackson JSON Mapper -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>${jackson.version}</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-core-asl</artifactId>
        <version>${jackson.version}</version>
    </dependency>
...


サーブレット
これは私のサーブレットの定義です:

    <servlet>
    <servlet-name>metrics</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:metrics-application-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>metrics</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:metrics-servlet.xml</param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>
4

3 に答える 3

1

Spring コンテキストで Jackson シリアライザーを初期化していないようです。

次の行を metrics-servlet.xml に追加してみてください。

    <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
</beans>

参考までに、私の春のサーブレットは、mvc、Bean、およびコンテキスト バージョン 3.2 を使用しています。

お役に立てれば!

于 2013-09-19T20:54:10.870 に答える
0

応答が JSON として識別されるように、に追加produces="application/json"する必要があります。@RequestMapping

@RequestMapping(value = "/Metrics/type3", method = RequestMethod.GET, produces="application/json")
于 2013-09-19T09:13:53.000 に答える