43

JSONを使用して応答を取得しようとするとSpring 3.x406 error「この要求によって識別されたリソースは、request"accept" ヘッダー () に従って受け入れられない特性を持つ応答を生成することしかできません」というメッセージが表示されます。

私の環境はこちら

* Spring 3.2.0.RELEASE
* included jackson-mapper-asl-1.7.9.jar, jackson-core-asl-1.7.9.jar
* Tomcat 6.x
* mvc:annotation-driven in Spring configuration XML file

私のコントローラー:

@RequestMapping("/contest")
public class ContestController {

    @RequestMapping(value="{name}", headers="Accept=*/*", method = RequestMethod.GET)
    public @ResponseBody Contest getContestInJSON(@PathVariable String name) {
        Contest contest = new Contest();
        contest.setName(name);
        contest.setStaffName(new String("contestitem1"));

        return contest;
    }

}

私のSpring構成ファイル

<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"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

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

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

<property name="mediaTypes">
    <map>
      <entry key="atom" value="application/atom+xml"/>
      <entry key="html" value="text/html"/>
      <entry key="json" value="application/json"/>
    </map>
 </property>

 <property name="viewResolvers">
 <list>
  <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
  </bean>
 </list>
 </property>

 <property name="defaultViews">
  <list>
   <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
  </list>
 </property>

 </bean>

<mvc:annotation-driven />

</beans>

この後、以下を使用してコントローラーにアクセスします。

http://domain/SpringWebProject/json/contest/abcd

そして、私が得る応答はステータス406です。

Javascript AJAXこれを使用してリクエストヘッダーにアクセスすることで代替メカニズムも試しましたapplication/JSONが、これにより同じステータス406の結果が得られました

$.getJSON('contest/abcd', function(data) {
console.log(data) }

ブラウザからキャプチャされた私の REQUEST HEADER は次のとおりです。

Request URL:http://localhost:8080/SpringWebProject/json/contest/abcd
Request Method:GET
Status Code:406 Not Acceptable

Accept:application/json, text/javascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=59689C95B0B9C21494EB0AB9D9F7BCCD
Host:localhost:8080
Referer:http://localhost:8080/SpringWebProject/json/welcome
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
X-Requested-With:XMLHttpRequest
Response Headersview source
Content-Length:1070
Content-Type:text/html;charset=utf-8
Date:Fri, 12 Oct 2012 18:23:40 GMT
Server:Apache-Coyote/1.1

この点で何か助けていただければ幸いです。

4

14 に答える 14

49

私もこの同じ問題を経験しました。以前は 3.1.2.RELEASE があり、すべて機能していたので、最新の 3.2.0.RELEASE の問題であると思われます。3.2.0.RELEASE に変更すると壊れます。3.1.3.RELEASE でテストしたところ、問題なく動作しました。したがって、今のところ、3.1.3.RELEASE にロールバックすることをお勧めします。

編集:次の場所にリンクされているこのサイトの別の投稿に感謝します: http://static.springsource.org/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-構成コンテンツ ネゴシエーション

要求されたパスの拡張子に基づいてメディア タイプの取得を無効にすることで、機能するようになりました。これは、次の方法で実行できます。

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"/>
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <!-- Turn off working out content type based on URL file extension, should fall back to looking at the Accept headers -->
    <property name="favorPathExtension" value="false" />
</bean>

また、すべての xsd スキーマの場所にバージョン 3.2 を指定します。

そして、これは次のジャクソンjarを使用しています:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.1.2</version>
</dependency>
于 2012-12-18T18:35:17.797 に答える
20

構成に問題はありませんが、いくつかの小さな変更を提案させてください。

a)名前空間が間違っているように見えます-3.0スキーマを参照しているので、3.1スキーマに変更するか、バージョンを明示的に参照しないでください。たとえば、このようになります。

xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans.xsd

また

xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

b)ContentNegotiatingViewResolverは必要ありません。構成から、component-scanおよび以外のすべてを削除できます。<mvc:annotation-driven/>

c)「application / json」のAcceptヘッダーが明示的に必要なため、リクエストはブラウザから直接機能しません。$.getJsonただし、正しいヘッダーを送信するため、呼び出しは機能するはずです。

d)headers=Acc..@RequestMappingからを削除し、生成します。どちらも、正しいマップされたメソッド呼び出しに一致するフィルタリング基準です。

これらを使用すると、jsonが提供されない理由はありません。これらを試して、どのように動作するかを確認してください。

于 2012-10-13T12:37:16.597 に答える
11

私は同じ問題を抱えていましたが、次の依存関係を追加して解決しました

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

以前は、次の依存関係でそれを行っていました

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${com.jackson.core-version}</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${com.jackson.core-version}</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${com.jackson.core-version}</version>
</dependency>

つまり、com.fasterxml.jackson.core をorg.codehaus.jacksonに置き換えました。

于 2013-12-22T06:46:02.163 に答える
8

Spring MVC 4 でこの問題が発生しました。jackson-annotations、jackson-core、jackson-databind を追加しても問題は解決しませんでした。このライブラリを試してください:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.1.2</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.1.2</version>
</dependency>
<dependency>
  <groupId>org.codehaus.jackson</groupId>
  <artifactId>jackson-mapper-asl</artifactId>
  <version>1.9.13</version>
</dependency>
于 2014-08-29T20:10:19.780 に答える
7

@RequestMapping にproduces="application/json" を追加する必要があると思います(しばらくSpring MVCを見ていないので、100%肯定的ではありません)...

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html

16.3.2.6 生産可能なメディアの種類

生成可能なメディア タイプのリストを指定することで、プライマリ マッピングを絞り込むことができます。要求は、Accept 要求ヘッダーがこれらの値のいずれかに一致する場合にのみ一致します。さらに、プロデュース条件を使用すると、レスポンスの生成に使用される実際のコンテンツ タイプがプロデュース条件で指定されたメディア タイプを尊重することが保証されます。例えば:

@Controller
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {    
    // implementation omitted
}
于 2012-10-12T18:50:20.513 に答える
7

私は同じ問題を抱えていましたが、この回答でBiju Kunjummenが追加したコメントは私にとって完璧に機能しました

https://stackoverflow.com/a/12873170/20654

それは私のJavaクラスにパブリックゲッターを持っています

于 2013-08-14T09:50:44.960 に答える
6

同様の問題がありましたが、jackson-databindライブラリを追加すると解決しました。

これらは私の依存関係です:

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.12</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.3</version>
</dependency>
于 2014-12-12T16:19:21.343 に答える
3

まもなく:

Spring MVC 4.1.6 の場合は十分です。

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.5.0</version>
</dependency>

jackson-databindは、コアおよび注釈アーティファクトに依存しています。


詳細に:

HTTP 406エラーとは何ですか?

406 Not Acceptable 要求されたリソースは、要求で送信された Accept ヘッダーによると、受け入れられないコンテンツを生成することしかできません。

これは、Accept HeaderにMEDIA TYPEが記述されているコンテンツをサーバーが生成できないことを意味します。

しかし、サーバーはどのメディアタイプを生成でき、どのメディアタイプを生成できないかをどのように知るのでしょうか?

Spring Web にはHttpMessageConverterの概念があります。これらのコンバーターの一部はすでに Spring に登録されており、AbstractMessageConverterMethodArgumentResolverはそれらをプロパティmessageConvertersに保持します。

リクエスト処理中に、 AbstractMessageConverterMethodProcessorは、Springが変換できるものを分析し、サポートされているすべてのメディア タイプproducibleMediaTypes変数に保存します。要求されたメディア タイプが生成できない場合エラー 406 == 要求されたメディア タイプを生成できません。ごめん。

簡単に言うと、必要なコンバーターを登録します。あなたの場合、application/jsonを生成するのはjacksonライブラリです

于 2015-06-10T21:36:43.257 に答える
0

http://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-config-content-negotiationをご覧 ください

"リクエスト URI、MVC Java 構成、および MVC 名前空間のファイル拡張子については、Jackson、JAXB2、または Rome などの対応する依存関係が存在する場合、.json、.xml、.rss、および .atom などの拡張子を自動的に登録します。クラスパス。」

URI の末尾に「.json」を追加する必要があります ( http://domain/SpringWebProject/json/contest/abcd.json など)。

于 2015-06-07T07:23:47.887 に答える
0

同様の問題がありましたが、奇妙でした。私がどのように解決したかを説明します。

私の web.xml では、ディスパッチャ サーブレットが *.htm にマップされていました

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

そして、私が何をしたとしても、それはいつも投げました-

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

最後に私はそれを

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

そしてそれはうまくいきました。私が思うのは、指定するだけのときです

<mvc:annotation-driven/> 

拡張子は Accept ヘッダーよりも優先され、.htm が問題を引き起こしていました。そして明らかに、サーブレット自体がマップされていないため、xml または json を使用できませんでした。

また、Spring がマッピングを試行し、着信リクエストのヘッダーを受け入れるというアノテーションを生成することも追加したいと思います。json と xml に対してジェネリックなリクエスト ハンドラー メソッドを作成していました。私はJava 8を使用しており、JaxbはJavaに組み込まれているため、Java 7以降はJAXB依存関係は必要ありません。jsonの場合、追加するだけで済みました-

<dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.8.5"/>

依存関係の管理に ivy を使用しています。

于 2017-01-14T15:55:46.897 に答える
-1

Spring 4 を使用している場合は、ライブラリのみを更新する必要があります。

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.3.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.3.0</version>
    </dependency>
于 2015-05-30T06:06:51.617 に答える