Я просто потратил некоторое время на устранение неполадок в аспекте разрешения параметров метода-обработчика по умолчанию в Spring MVC, и я хотел бы спросить тех, кто ближе к проекту, является ли это намерением или было бы разумно открыть заявку, предлагающую изменение .
Проблема связана с разрешением по умолчанию объектов в стиле POJO в параметрах метода, например так:
@RequestMapping("/endpointwithparams")
public String endpointWithParams(EndpointParams params) {
// Do some stuff
return "viewname";
}
Без аннотаций или специальных средств разрешения аргументов Spring будет пытаться связать объект EndpointParams путем сопоставления параметров запроса с именами его полей. Он даже запускает валидаторы, если таковые настроены. Это кажется великолепным - это позволяет мне писать простые объекты POJO для организации связанных наборов параметров без необходимости иметь собственный преобразователь аргументов для каждого из них.
Часть, которая меня отбрасывает, заключается в том, что после создания объекта EndpointParams он будет также автоматически добавляться в модель. Это связано с тем, что фактическим преобразователем этого параметра будет ModelAttributeMethodProcessor с установленным в true значением флага annotationNotRequired. Я не хочу, чтобы этот параметр был добавлен в модель - его наличие вызывает некоторые проблемы в будущем - и мне определенно не было интуитивно понятно, что я должен ожидать, что это дополнение произойдет для параметра, который не был аннотирован @ModelAttribute.
Это поведение также не согласуется с тем, что происходит, когда у вас есть «простой» параметр запроса, подобный этому:
@RequestMapping("/endpointwithparams")
public String endpointWithParams(String param) {
// Do some stuff
return "viewname";
}
В приведенном выше примере параметр String будет разрешен с помощью RequestParamMethodArgumentResolver, который не добавит что-либо к модели.
Разумно ли предположить, что лучшая логика по умолчанию для неаннотированных параметров POJO будет такой же привязкой и проверкой, что и в настоящее время, но без автоматического добавления в модель? Или есть какой-то контекст, который мне не хватает, что делает полное поведение @ModelAttribute лучшим выбором по умолчанию?