Отображение объекта, полученного через @ModelAttribute, в объект Object - PullRequest
0 голосов
/ 24 июня 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...