2013-07-10 3 views
1

객체와 컨트롤러에서 나는 기능이 있습니다POST 요청 나는 스프링 MVC를 사용

내가 요청을 보내는 클라이언트 측에서
@ResponseBody 
@RequestMapping(value = "/json/negotiation/Supervisor.json", produces = "application/json", method = RequestMethod.POST) 
public ExtResponse changeSupervisorStep(@RequestBody BatchModel<Supervisor> supervisors) {...} 

(ExtJS로 사용) :

Ext.Ajax.request({ 
url : '/jur_rest/json/negotiation/Supervisor.json', 
jsonData : { supervisors : {toInsert : [], toDelete : [], toUpdate : [] }} 
}); 

를 모든 것이 괜찮습니다 , 나는 3 개의 배열을 가진 객체를 얻는다. 하지만 클라이언트에서 다시 한 번 모델을 보내려는, 내가 그런 일을 작성하는 경우 :

@ResponseBody 
@RequestMapping(value = "/json/negotiation/Supervisor.json", produces = "application/json", method = RequestMethod.POST) 

public ExtResponse changeSupervisorStep(@RequestBody BatchModel<Supervisor> supervisors, @RequestBody Supervisor model) { ... } 

    Ext.Ajax.request({ 
    url : '/jur_rest/json/negotiation/Supervisor.json', 
    jsonData : { supervisors : {toInsert : [], toDelete : [], toUpdate : [] }, model : {}} 
    }); 

나는 오류 얻을 - 400 잘못된 요청합니다. 뭐가 문제 야? 감사.

편집 :

learning Spring's @RequestBody and @RequestParam 컨트롤러 기능에 하나의 @RequestBody의 parametr가있을 수 있습니다. 하나의 요청으로 두 모델을 전달하려면 어떻게해야합니까? 그것들을 하나의 클래스로 결합 하시겠습니까?

+0

두 개의 json 문자열의 차이점은'model : {}'부분입니다. Spring은 아마도 그것을 매핑하는 방법을 모른다. –

+0

죄송합니다, 내 실수 - http://stackoverflow.com/questions/3337350/learning-springs-requestbody-and-requestparam @RequestBody 매개 변수는 하나만있을 수 있지만 어떻게 두 모델을 전달할 수 있습니까?! – Shallow

+2

'Supervisor'와'BatchModel'을 모두 포함하는 DTO를 생성하십시오. 그런 다음'@ RequestBody'와 함께 사용하십시오. –

답변

4

원하는만큼 많은 매개 변수에 @RequestBody 주석을 달 수 있습니다. 그러나 귀하의 요청이 JSON 인 경우 잡을 수 있습니다 : 전체 요청은 하나의 객체입니다. 그리고 하나의 객체는 거의 두 가지 유형이 될 수 없습니다. 상황에 따라 당신의 대안은 다음과 같습니다 서버에

    보내지 마십시오
  • JSON가 사용 데이터 대신
  • 를 urlencoded를
  • 사용
  • 자신의 메시지 컨버터 쓰기의 모든 유형을 포함하는 DTO

IMHO 두 가지 모델을 서버로 보내면 설계상의 문제입니다. 그래서 진심 어린 조언은 그것에 대해 생각하는 것입니다. 설계를 쉽게 변경할 수 없다고 가정하면 DTO와 함께 갈 것입니다.

+0

예, 디자인 문제가 있었지만 약간의 변경이 필요했습니다. 이제 DTO가 없어도 하나의 객체를 전달합니다. 감사합니다. – Shallow

0

메시지 변환기를 작성하는 것보다 쉬운 래퍼로 두 모델을 래핑하거나 두 모델 모두에 동일한 이름의 특성이 포함되어 있으면 문제를 일으킬 수있는 동일한 DTO에서 두 개체를 과도하게 사용할 수 있습니다.

class WrapperDTO(){ 
    DtoA dtoA; 
    DtoB dtoB; 

    public WrapperDTO(DtoA dtoA, DtoB dtoB){ 
    this.dtoA = dtoA; 
    this.dtoB = dtoB 
    } 

} 

컨트롤러의 방법은 당신이 할 수 있습니다 :

@ResponseBody 
@RequestMapping(value = "/json/negotiation/Supervisor.json", produces = 
"application/json", method = RequestMethod.POST) 
public ExtResponse changeSupervisorStep(@RequestBody WrapperDTO wrapperDTO) 
{....} 

A to D와 D to A와 DtoB 이제 래퍼 내에서 채워 져야

당신이 뭔가를 할 것입니다. 이전 답변과 같습니다. DTO를 사용하여 요청 페이로드를 처리하는 것이 좋습니다.