我使用Spring 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 : [] }}
});
一切都很好,我得到三个数组的对象。但我想再次从客户端发送模型,如果我写的那样:
@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参数。如何在一个请求中传递两个模型?把它们组合成一个班级?
答案 0 :(得分:4)
您可以根据需要使用@RequestBody
注释任意数量的参数。但是当你的请求是JSON
时,有一个问题:整个请求是一个对象。一个对象很难有两种不同的类型。根据具体情况,您可以选择:
JSON
发送到服务器,而是使用urlencoded数据恕我直言,有两个不同的模型发送到服务器是一个设计问题。所以我真诚的建议是考虑一下。假设您不能轻易改变设计,我会选择DTO。
答案 1 :(得分: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来处理请求有效负载。