3

json/xmlを返すRESTアプリケーションがあります。変換にはjacksonとjaxbを使用します。一部のメソッドはquery_stringを受け入れる必要があります。@ModelAttributeを使用してquery_stringをオブジェクトにマップしましたが、これによりオブジェクトが強制的にビューに表示されます。オブジェクトをビューに表示したくありません。

@ModelAttribute以外のものを使用する必要があると思いますが、バインドの方法がわかりませんが、ビューを変更することはできません。@ModelAttributeアノテーションを省略すると、オブジェクトは変数名としてビューに表示されます(例: "sourceBundleRequest")。

URLの例:

http://localhost:8080/rest/sourcebundles/?updateDate=20100501&label=urgent

コントローラ方式:

@RequestMapping(value = {"", "/"}, method = RequestMethod.GET)
public String getAll(@ModelAttribute("form") SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model) throws ApiException {
    // Detect and report errors.
    if (result.hasErrors()) {
       // (omitted for clarity)
    }

    // Fetch matching data.
    PaginatedResponse<SourceBundle> sourceBundleResponse = null;
    try {
        int clientId = getRequestClientId();
        sourceBundleResponse = sourceBundleService.get(clientId, sourceBundleRequest);
    } catch (ApiServiceException e) {
        throw new ApiException(ApiErrorType.INTERNAL_ERROR, "sourceBundle fetch failed");
    }

    // Return the response.
    RestResponse<PaginatedResponse> restResponse = new RestResponse<PaginatedResponse>(200, "OK");
    restResponse.setData(sourceBundleResponse);
    model.addAttribute("resp", restResponse);
    // XXX - how do I prevent "form" from appearing in the view?
    return "restResponse";
}

出力例:

"form": {
    "label": "urgent",
    "updateDate": 1272697200000,
    "sort": null,
    "results": 5,
    "skip": 0
},
"resp": {
    "code": 200,
    "status": "OK",
    "data": {
        "totalAvailable": 0,
        "resultList": [ ]
    }
}

必要な出力:

"resp": {
    "code": 200,
    "status": "OK",
    "data": {
        "totalAvailable": 0,
        "resultList": [ ]
    }
}

@ModelAttribute( "form")を省略

@ModelAttribute( "form")を単純に省略した場合でも、望ましくない応答が返されますが、受信フォームにはオブジェクト名が付けられます。応答は次のようになります。

"resp": {
    "code": 200,
    "status": "OK",
    "data": {
        "totalAvailable": 0,
        "resultList": [ ]
    }
},
"sourceBundleRequest": {
    "label": "urgent",
    "updateDate": 1272697200000,
    "sort": null,
    "results": 5,
    "skip": 0
}
4

3 に答える 3

3

フォームをビューに戻さない場合は、フォームに@ModelAttributeアノテーションを付ける必要はありませんSourceBundleRequest。@ModelAttributeアノテーションがなくても、フォームはクリーンにバインドされます。

現在、SpringMVCを使用してJSON/ XML応答を返す標準的な方法は、型を直接返し(この場合はPaginatedResponse)、メソッドに。で注釈を付けることです@ResponseBody。基になるHttpMessageConverterものは、Acceptに基づいて応答をXML/JSONに変換します。クライアントからのヘッダー。

@ResponseBody
public RestResponse<PaginatedResponse> getAll(SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model)
...
于 2012-08-25T02:49:35.963 に答える
1

どういうわけか私はこれを修正するための最も明白な方法を逃しました。私は属性に焦点を合わせていましたが、基になるマップを変更するだけでよいことを忘れていました。

  // Remove the form object from the model map.
  model.remove("form");

Bijuが提案したように@ModelAttributeを省略してから、sourceBundleRequestオブジェクトを削除する方が少し効率的かもしれません。@ModelAttributeには追加のオーバーヘッドがあると思います。

于 2012-08-30T21:41:44.240 に答える
0

@JsonIgnoreを使用するのはどうですか?

@ModelAttribute("foo")
@JsonIgnore
public Bar getBar(){}

これをテストしていません

于 2014-04-27T20:04:52.120 に答える