В нашем проекте мы используем модульный подход для создания сложных объектов (мы ожидаем список объектов с кодом типа объекта и содержимого), и все работало нормально, пока мы не наткнулись на модуль, содержащий файлы 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
out content
объекты пусты, поэтому мы не можем их разыграть.
Если мы изменим определение ContractModuleDts
, чтобы указать тип содержимого, оно будет работать, но поскольку тип содержимого определяется во время выполнения, мы не можем объявить его.
Итак, вопрос в том, как мы можем получить content
из атрибута модели (или из httpServletRquest, если необходимо), чтобы он имел поля и мог быть приведен во время выполнения?