带有两个JSON对象的POST请求

时间:2013-07-10 13:20:30

标签: java spring spring-mvc extjs

我使用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参数。如何在一个请求中传递两个模型?把它们组合成一个班级?

2 个答案:

答案 0 :(得分:4)

您可以根据需要使用@RequestBody注释任意数量的参数。但是当你的请求是JSON时,有一个问题:整个请求是一个对象。一个对象很难有两种不同的类型。根据具体情况,您可以选择:

  • 请勿将JSON发送到服务器,而是使用urlencoded数据
  • 使用包含所有类型的DTO
  • 编写自己的消息转换器

恕我直言,有两个不同的模型发送到服务器是一个设计问题。所以我真诚的建议是考虑一下。假设您不能轻易改变设计,我会选择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来处理请求有效负载。