Нет ничего встроенного, чтобы сделать это, не все же в любом случае. В текущих версиях выпуска вам все равно нужно будет использовать WebDataBinder для привязки ваших параметров к объекту, если вам нужна автоматическая проверка. Это стоит научиться делать, если вы используете SpringMVC, даже если это не ваш первый выбор для этой задачи.
Это выглядит примерно так:
public ModelAndView createFoo(@PathVariable long level1,
@PathVariable long level2,
@Valid @ModelAttribute() FooWrapper fooWrapper,
BindingResult errors) {
if (errors.hasErrors() {
//handle errors, can just return if using Spring form:error tags.
}
}
public static class FooWrapper {
@NotNull
@Size(max=32)
private String fooName;
private String description;
//getset
}
Если у вас есть Hibernate Validator 4 или более поздней версии на вашем пути к классам и вы используете настройку диспетчера по умолчанию, он должен «Просто работать».
Редактирование с тех пор, как комментарии стали довольно большими:
Любой объект, который находится в сигнатуре вашего метода и не является «ожидаемым», который Spring знает, как внедрить, например, HttpRequest
, ModelMap
и т. Д., Будет привязан к данным. Это достигается для простых случаев, просто сопоставляя имена параметров запроса с именами свойств бинов и вызывающими сеттерами. @ModelAttribute
- это просто личный стиль, в этом случае он ничего не делает. Интеграция JSR-303 с @Valid по параметру метода проходит через WebDataBinder
. Если вы используете @RequestBody
, вы используете маршаллер объекта, основанный на типе контента, который Spring определяет для тела запроса (обычно только из заголовка http.) Сервлет диспетчера (на самом деле AnnotationMethodHandlerAdapter
) не имеет способа 'щелкнуть ключом проверки' для любого произвольного маршаллера. Он просто передает содержимое веб-запроса в конвертер сообщений и возвращает объект. Объект BindingResult не генерируется, поэтому в любом случае устанавливать ошибки некуда.
Вы все еще можете просто вставить свой валидатор в контроллер и запустить его на полученном объекте, он просто не имеет волшебной интеграции с @Valid
в параметре запроса, заполняющем для вас BindingResult
.