2013-07-10 75 views
1

我使用Spring MVC和控制器我有功能:POST请求对象

@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 : [] }} 
}); 

,一切都很好,我得到了三个数组的对象。但我想再次发送客户端的模型,如果我写这样的东西:

@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字符串之间是'模式:{}'一部分。春天可能不知道如何映射它。 –

+0

哎呀,我的错误 - http://stackoverflow.com/questions/3337350/learning-springs-requestbody-and-requestparam 只能有一个@RequestBody parametr,但我怎么能传递两个型号?! – Shallow

+2

创建一个包含'Supervisor'和'BatchModel'的DTO。然后用'@ RequestBody'来使用它。 –

回答

4

只要你喜欢你可以用标注为@RequestBody许多参数。但是当你的请求是JSON时有一个问题:整个请求是一个对象。一个对象几乎不可能是两种不同的类型。根据不同的情况你的替代品:

  • 不要发送JSON到服务器,使用url编码数据,而不是
  • 使用包含所有类型
  • 写自己的消息转换器一个DTO

恕我直言,有两种不同的型号发送到服务器是一个设计问题。所以我诚恳的建议是想想那个。假设你不能轻易改变设计,我会选择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) 
{....} 

DTOA和DtoB现在应该在包装中的填充。 像以前的答案。我会建议使用DTO来处理请求负载。