【问题标题】:POST request with two JSON objects带有两个 JSON 对象的 POST 请求
【发布时间】:2013-07-10 13:20:29
【问题描述】:

我使用 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 参数。如何在一个请求中传递两个模型?将它们合并为一个类?

【问题讨论】:

  • 您的两个 json 字符串之间的区别在于 model: {} 部分。 Spring 可能不知道如何映射它。
  • 糟糕,我的错误 - stackoverflow.com/questions/3337350/… @RequestBody 参数只能有一个,但我怎么能传递两个模型?!
  • 创建一个包含 SupervisorBatchModel 的 DTO。然后将其与@RequestBody 一起使用。

标签: java spring spring-mvc extjs


【解决方案1】:

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

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

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

【讨论】:

  • 是的,您对设计问题的看法是正确的,需要进行一些更改,现在即使没有 DTO,我也传递了一个对象,谢谢。
【解决方案2】:

您还可以将两个模型包装在包装器中,这比编写自己的消息转换器更容易,或者尝试将两个对象塞入同一个 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 来处理请求负载。

【讨论】:

    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    相关资源
    最近更新 更多