13

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

appconfig.xmlエントリに関しては、これらが必要かどうかわかりません。私は、昔のファッションの非json ajaxに戻る前に、必死の最後の行為としてそれらをそこに入れました。

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

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

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

私の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.");
  });
}

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

4

8 に答える 8

14

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

于 2010-07-27T07:39:00.920 に答える
3
  1. 返すPOJOにget()ersがフィールドごとに1つずつあることを確認してください。
  2. ビルドシステム(Eclipse / Maven)にライブラリがあることが確実な場合でも、appserver(Tomcat)にライブラリがあることを確認してください。

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

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

于 2014-10-10T05:41:12.817 に答える
2

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

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

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

于 2012-07-25T20:57:33.097 に答える
2

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

于 2014-09-22T13:37:14.913 に答える
2

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

私はジャクソンの依存関係をから更新することでそれを解決しました

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

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

于 2015-03-12T00:18:05.070 に答える
1

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

于 2010-10-25T12:04:10.053 に答える
1

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

于 2012-03-30T23:38:24.083 に答える
0

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

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

 hibernate-validator-4.0.2 

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

slf4j-api-1.5.6.jar

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

于 2012-06-27T07:12:36.060 に答える