24

私は自分のメッセージコンバーターをジャクソンのものとして設定します

class Foo{int x; int y}

そしてコントローラーで

@ResponseBody
public Foo method(){
   return new Foo(3,4)
}

その im から、他の構成なしでサーバーから JSON 文字列 {x:'3',y:'4'} を返すことを期待しています。しかし、私のajaxリクエストに対して404エラー応答を取得しています

メソッドに @ResponseBody のアノテーションが付けられている場合、戻り値の型は応答の HTTP 本文に書き込まれます。戻り値は、HttpMessageConverters を使用して、宣言されたメソッド引数の型に変換されます。

私が間違っている ?または、シリアライザーを使用して自分で応答オブジェクトをJson文字列に変換し、その文字列を応答として返す必要があります.(文字列応答を正しく作成できます)または他の構成を行う必要がありますか? クラス Foo の注釈を追加するような

ここに私のconf.xmlがあります

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">

  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="jacksonMessageConverter"/>
  </list>
</property>

4

8 に答える 8

22

次のものが必要です。

  1. アノテーション駆動型プログラミングモデルを設定<mvc:annotation-driven />する:spring.xml
  2. jaskson jar(MavenartifactIdはorg.codehaus.jackson:jackson-mapper-asl)をクラスパスに配置します。
  3. 次のように使用します。

    @RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
    public @ResponseBody Foo method(@Valid Request request, BindingResult result){
    return new Foo(3,4)
    }
    

これは私のために働きます。

その点に注意してください

  1. @ResponseBodyメソッド定義ではなく、戻り型に適用されます。
  2. @RequestMappingSpringがそれを検出できるように、注釈が必要です。
于 2010-09-21T15:57:37.317 に答える
3

これは私のために働いた:

@RequestMapping(value = "{p_LocationId}.json", method = RequestMethod.GET)
protected void getLocationAsJson(@PathVariable("p_LocationId") Integer p_LocationId,
     @RequestParam("cid") Integer p_CustomerId, HttpServletResponse response) {
        MappingJacksonHttpMessageConverter jsonConverter = 
                new MappingJacksonHttpMessageConverter();
        Location requestedLocation = new Location(p_LocationId);
        MediaType jsonMimeType = MediaType.APPLICATION_JSON;
        if (jsonConverter.canWrite(requestedLocation.getClass(), jsonMimeType)) {
        try {
            jsonConverter.write(requestedLocation, jsonMimeType,
                                   new ServletServerHttpResponse(response));
            } catch (IOException m_Ioe) {
                // TODO: announce this exception somehow
            } catch (HttpMessageNotWritableException p_Nwe) {
                // TODO: announce this exception somehow
            }
        }
}

このメソッドは何も返さないことに注意してくださいMappingJacksonHttpMessageConverter#write()。魔法のように動作します。

于 2010-05-06T21:00:51.023 に答える
3

MessageConverter インターフェースhttp://static.springsource.org/spring/docs/3.0.x/javadoc-api/は getSupportedMediaTypes() メソッドを定義します。これは、MappingJacksonMessageCoverter が application/json を返す場合に使用されます。

public MappingJacksonHttpMessageConverter() {
    super(new MediaType("application", "json", DEFAULT_CHARSET));
}

Accept: application/json リクエスト ヘッダーが欠落していると仮定します。

于 2011-02-23T19:44:18.613 に答える
2

HTTP 404 エラーは、リソースが見つからないことを意味します。これには 2 つの原因が考えられます。

  1. リクエスト URL が間違っています (クライアント側のエラーまたは指定されたリンク/ボタンの URL が間違っています)。
  2. リソースが期待する場所にありません (サーバー側のエラー)。

1 を修正するには、正しい要求 URL を使用または指定していることを確認してください (大文字と小文字を区別します)。2 を修正するには、サーバーの起動ログで起動エラーを確認し、それに応じて修正します。

これはすべて、投稿されたコードと情報を超えています。

于 2010-02-14T00:52:51.583 に答える
1

jackson-mapper-asl.jarだけでなく、jackson-core-asl.jarも必要であることがわかりました。

于 2010-12-08T03:55:24.940 に答える
0

404 は HttpMessageConverter とは関係がないと思います。同じ 404-issue がありましたが、その理由は、一致するリクエストのみが DispatcherServlet に送信されることを忘れていたためです<url-pattern>(リクエストマッピングを *.do から *.json に変更しました)。多分これはあなたのケースでもあります。

于 2010-04-05T09:19:46.277 に答える
0

ここでの回答に加えて..

クライアント側でjqueryを使用している場合、これはうまくいきました:

ジャワ:

@RequestMapping(value = "/ajax/search/sync") 
public ModelAndView sync(@RequestBody Foo json) {

Jquery (JSON.stringify 関数を使用するには Douglas Crockford の json2.js を含める必要があります):

$.ajax({
    type: "post",
    url: "sync", //your valid url
    contentType: "application/json", //this is required for spring 3 - ajax to work (at least for me)
    data: JSON.stringify(jsonobject), //json object or array of json objects
    success: function(result) {
        //do nothing
    },
    error: function(){
        alert('failure');
    }
});
于 2012-08-12T13:54:26.493 に答える
0

これは単なる推測ですが、デフォルトでは、Jackson はパブリック フィールド (およびパブリック ゲッター。ただし、可視性に関係なくすべてのセッター) のみを自動検出します。これを (バージョン1.5で) 必要に応じてプライベート フィールドを自動検出するように構成することもできます (詳細については、こちらを参照してください)。

于 2010-03-22T16:52:09.550 に答える