web-dev-qa-db-ja.com

SpringのJsonが適切な応答で解決されていない

SpringのコントローラーにJSON応答を返してもらい、Jacksonクラスを .0で推奨 として使用して無駄にしようとしました。もちろん、クラスパスにjackson jarファイル(jackson-core-asl-1.5.5.jar&jackson-mapper-asl-1.5.5.jar)があります。

Appconfig.xmlエントリに関しては、これらが必要かどうかわかりません。昔ながらの非jsonajaxに戻る前に、必死の最後の行為としてそれらをそこに入れました。

デバッグでは、コントローラーがリクエストを取得し、fooを返し、firebugで406を取得するのを監視します。

エラーメッセージは次のとおりです。デバッグに設定されている場合のロガーから:org.springframework.web.HttpMediaTypeNotAcceptableException:受け入れ可能な表現が見つかりませんでした

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

私のappconfig.xmlはここにあります:

    <!-- Configures support for @Controllers -->
    <mvc:annotation-driven />

    <!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="mediaTypes">
    <map>
      <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/views/"/>
        <property name="suffix" value=".jsp"/>
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"></property>
    </bean>

私のコントローラー

@RequestMapping(value="foo/bar", method=RequestMethod.GET)
public @ResponseBody foo getFoo(@RequestParam String fooId) {
    return new foo(fooId); 
}

Ajax呼び出しが行われるjspでは:

function addRow() {
  $.getJSON("foo/bar", {
    fooId: 1
  }, function(data) {
    alert("it worked.");
  });
}

必要な情報が他にあるかどうか教えてください。

13
ClutchDude

すべてのJacksonBeanと、ネゴシエーションリゾルバーのjsonマッピングを削除します。 mvc:annotation-drivenは、Jacksonシリアル化が機能するために必要なすべてを構成する必要があります。

14
Bozho
  1. 返すPOJOに各フィールドに1つずつget()ersがあることを確認してください。
  2. ビルドシステム(Eclipse/Maven)にライブラリがあることが確実な場合でも、アプリサーバー(Tomcat)にライブラリがあることを確認してください。

このエラーが2回発生しました。ちょうど今、私は自分のpojoにゲッターを追加しました。 406エラーがなくなり、期待どおりにJSONを取得しました。私のフィールドはパッケージで保護されている(デフォルトのアクセス)ので、それらを取得すると思いますが、そうではないと思います。記録として、重要な場合は、POJOにSerializable、toString()、serialVersionUID、no-argコンストラクター、および明示的コンストラクターも実装させました。

前回、Tomcatキャッシュをクリーンアップ/クリア/更新し、他のことを行って強制的にリロードしました。 Jacksonの依存関係を追加すると、コンパイル時のエラーが修正されたと思いますが、Tomcatがそれらを見逃したため、実行時にSpring MVCはJacksonライブラリを検出せず、許容できない応答タイプに関する406エラーを生成しました。

3
David Lotts

また、必ず2つのjackson関連のjarファイルを追加してください。

  • jackson-core-asl-1.9.8.jar
  • jackson-mapper-asl-1.9.8.jar

バージョンは異なる場合があります。

2
user1552854

これが古いスレッドであることは知っていますが、誰かが私と同じ問題に遭遇するかもしれません。アプリケーションをSpring4.0.3.RELEASEからSpring4.1.0.RELEASEに移行するときに例外が発生しました。私の場合、Jacksonを1.9.xから2.4.xに更新することでうまくいきました。

2
Apokralipsa

この質問はネットのいたるところに出てきて、私は何度かそれに噛まれました。 Spring 3.0.6(およびおそらく5)には、jsonのレンダリングにいくつかの問題があります。 3.1.0.RELEASEバージョンに変更すると、eveyrythingはそのまま機能しました。構成を変更せずに。注意すべき点は、returnメソッドには(前の例のように)@ResponseBodyが必要であり、servlet-context.xmlまたはSpringコンテキスト構成ファイルに含まれている必要があります。

1
Mir3

Spring3.xからSpring4.xに移行するときに同じ例外が発生します。

からjacksonの依存関係を更新して解決しました

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

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

私には他に何も必要ありませんでした。

1
Patrik Bego

Accept:application/xmlヘッダーの送信は機能しません。しかし、Accept:application/jsonを送信すると、実際に機能し、jackson mapperが起動します。406を削除し、シリアル化されたJavaオブジェクトをjson形式で、@ ResponseBodyよりも構成が少なくて新しいものを返します。 MyObject():)この情報を提供してくれたskaffmanに感謝し、作業ヘッダー値を提供してくれたBozhoに感謝します:D

1
dark.gixxer

私の答えは少し遅れているかもしれませんが、それは他の誰かがこの質問を訪れるのを助けるかもしれません。

追加することで問題を解決しました

 hibernate-validator-4.0.2 

そして私に別の例外(クラスが見つからない例外:org.slf4j.LoggerFactory)を与えましたが、これを追加して解決しました

slf4j-api-1.5.6.jar

私はそれが誰かを助けることを願っています。

0
Shahzeb Khan