通过@ModelAttribute接收到的对象映射到域对象

时间:2019-06-24 14:10:37

标签: java spring-boot servlets casting modelattribute

在我们的项目中,我们使用模块化方法来创建复杂的对象(我们期望列表对象具有对象类型和内容的代码),并且一切正常,直到遇到包含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,以便它具有字段并可以在运行时进行转换?

0 个答案:

没有答案