在我们的项目中,我们使用模块化方法来创建复杂的对象(我们期望列表对象具有对象类型和内容的代码),并且一切正常,直到遇到包含Multipart文件的模块,因此我们需要更改其余部分从接受@RequestBody
到@ModelAttributes
的过程,由于此更改,当我们尝试将它们映射到域对象时,所有content
对象都是空的(这听起来很复杂,但我希望下面的代码能清除一些东西)
这是我们的休息控制器:
@PostMapping("/create")
public List<ContractModuleDts> create(@ModelAttribute ContractModulesDto contractModules) {
contractModuleService.createContract(contractModules.getModuleList());
return new ArrayList<>(createOrUpdateModuleCollector.getUpdatedOrCreatedModules());
}
我们的模型属性只是模块列表的翘曲,看起来像这样:
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ContractModulesDto {
private List<ContractModuleDts> moduleList = new ArrayList<>();
}
现在我们的ContractModuleDts
表示“要创建”模块,如下所示:
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ContractModuleDts implements Serializable {
private static final long serialVersionUID = 1127728967834186950L;
private ContractModule contractModule;
private Object content;
}
ContractModule
类是一个包含模块代码和一些定义的枚举(在我们的情况下并不重要),这里最重要的部分是content
。在contractModuleService.createContract
中,我们将内容强制转换为域对象(域对象的类由ContractModule确定)
当我们使用@RequestBody
时,实际上所有content
对象都是LinkedHashMap
并可以强制转换,但是当我们切换到@ModelAttributes
时,content
对象是为空,因此我们无法投放它们。
如果我们更改ContractModuleDts
的定义以指定内容类型,它将起作用,但是由于内容类型是在运行时确定的,因此无法声明它。
所以问题是我们如何从模型属性(或必要时从httpServletRquest)中获取content
,以便它具有字段并可以在运行时进行转换?