1

我使用 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 错误请求。怎么了?谢谢。

编辑:

学习 Spring 的 @RequestBody 和 @RequestParam 控制器函数中的 @RequestBody 参数只能有一个。如何在一个请求中传递两个模型?将它们合并为一个类?

4

2 回答 2

4

您可以根据需要注释任意数量的参数@RequestBody。但是当您的请求是JSON:整个请求是一个对象。一个物体几乎不可能是两种不同的类型。根据具体情况,您的替代方案是:

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

恕我直言,将两种不同的模型发送到服务器是一个设计问题。所以我真诚的建议是考虑一下。假设您不能轻易更改我将使用 DTO 的设计。

于 2013-07-11T20:03:25.883 回答
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 来处理请求负载。

于 2017-12-21T12:25:29.413 回答