Java 带有两个JSON对象的POST请求

Java 带有两个JSON对象的POST请求,java,spring,spring-mvc,extjs,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> superv

我使用Spring MVC,在控制器中我有以下功能:

@ResponseBody
@RequestMapping(value = "/json/negotiation/Supervisor.json", produces = "application/json", method = RequestMethod.POST)
public ExtResponse changeSupervisorStep(@RequestBody BatchModel<Supervisor> supervisors) {...}
一切都很好,我得到了三个数组的对象。但我想再次从客户那里发送一个模型,如果我这样写:

@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错误请求。发生了什么?谢谢

编辑:


控制器函数中只能有一个@RequestBody参数。如何在一个请求中传递两个模型?将它们组合成一个类?

您可以使用@RequestBody注释任意多个参数。但是当您的请求是JSON时,有一个陷阱:整个请求是一个对象。一个物体很难有两种不同的类型。根据具体情况,您的备选方案包括:

不要向服务器发送JSON,而是使用URL编码的数据 使用包含所有类型的DTO 编写自己的消息转换器
IMHO将两个不同的模型发送到服务器是一个设计问题。所以我真诚的建议是考虑一下。假设您无法轻松更改设计,我将使用DTO。

您可以使用@RequestBody注释任意多个参数。但是当您的请求是JSON时,有一个陷阱:整个请求是一个对象。一个物体很难有两种不同的类型。根据具体情况,您的备选方案包括:

不要向服务器发送JSON,而是使用URL编码的数据 使用包含所有类型的DTO 编写自己的消息转换器
IMHO将两个不同的模型发送到服务器是一个设计问题。所以我真诚的建议是考虑一下。假设您无法轻松更改设计,我会选择DTO。

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

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

两个json字符串之间的区别在于模型:{}部分。Spring可能不知道如何映射它。哎呀,我的错误-只有一个@RequestBody参数,但我怎么能传递两个模型?!创建一个DTO,其中包含您的主管和BatchModel。然后将其与@RequestBody一起使用。两个json字符串之间的区别是模型:{}部分。Spring可能不知道如何映射它。哎呀,我的错误-只有一个@RequestBody参数,但我怎么能传递两个模型?!创建一个DTO,其中包含您的主管和BatchModel。然后将其用于@RequestBody。是的,您在设计问题上是正确的,需要进行一些更改,现在我通过了一个对象,即使没有DTO,谢谢。是的,您在设计问题上是正确的,需要进行一些更改,现在我通过了一个对象,即使没有DTO,谢谢。