2012-08-24 5 views
3

json/xml을 반환하는 나머지 응용 프로그램이 있습니다. 나는 변환을 위해 잭슨과 잭버스를 사용한다. 일부 메소드는 query_string을 승인해야합니다. @ModelAttribute를 사용하여 query_string을 객체에 매핑했지만 객체가 내 뷰에 강제로 표시됩니다. 개체를보기에 표시하지 않습니다.보기에서 ModelAttribute를 생략합니다.

@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": [ ] 
    } 
} 
,363,210

생략 @ModelAttribute ("양식")

단순히 @ModelAttribute ("양식")를 생략하면, 난 여전히 바람직하지 않은 응답을하지만, 들어오는 양식 개체 이름으로 지정됩니다. 응답은 다음과 같습니다 다시보기에 와서 양식을하지 않으려면

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

답변

1

아무 래도이 문제를 해결하는 가장 확실한 방법을 놓쳤습니다. 나는 Attributes에 초점을 맞추었고 기본 Map을 수정할 수 있다는 것을 잊어 버렸습니다.

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

그것은 좀 더 효율적인 비주 제안으로 @ModelAttribute를 생략하고 sourceBundleRequest 개체를 제거 할 수 있습니다. @ModelAttribute에 약간의 오버 헤드가 있다고 의심됩니다.

3

당신은 @ModelAttribute와 형태에 주석을 필요가 없다, 그것은 깨끗하게 심지어 @ModelAttribute 주석없이 SourceBundleRequest에 바인딩 얻을 것이다 . 이제

, 스프링 MVC를 사용하여 JSON/XML 응답을 반환하는 표준 방법은 기본 HttpMessageConverter는 다음에 응답을 변환 것, @ResponseBody과 방법을 (당신의 케이스 PaginatedResponse에) 직접 형식을 반환하고 주석하는 것입니다 XML/JSON은 클라이언트의 Accept 헤더를 기반으로합니다.

@ResponseBody 
public RestResponse<PaginatedResponse> getAll(SourceBundleRequest sourceBundleRequest, BindingResult result, ModelMap model) 
... 
+0

을 테스트하지 않았습니다. 세부 사항으로 OP를 업데이트했습니다. 현재 @ ResponseBody 라우트를 사용하지 않기를 바란다. 내 명시적인 뷰 매핑이 좋으며 Accept 헤더 문제에 참여하고 싶지 않습니다. –

0

@JsonIgnore를 사용하는 것은 어떻습니까?

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

단순히 ModelAttribute 모 데르 나를 위해 작동하지 않습니다 @ 생략, 불행하게도이

관련 문제