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
}