1. введение
В этом уроке мы рассмотрим, как проверить параметры HTTP-запроса и переменные пути в Spring MVC.
В частности, мы проверим String и Number параметры с помощью JSR 303 аннотаций .
Чтобы изучить валидацию других типов, обратитесь к нашим учебным пособиям о валидации Java Bean и ограничениях методов или узнайте, как создать свой собственный валидатор .
2. Конфигурация
Чтобы использовать Java Validation API, мы должны добавить реализацию JSR 303, такую как hibernate-validator :
org.hibernate.validator hibernate-validator 6.0.10.Final
Кроме того, мы должны включить проверку как параметров запроса, так и переменных пути в наших контроллерах, добавив @Validated аннотацию :
@RestController @RequestMapping("/") @Validated public class Controller { // ... }
Важно отметить, что для включения проверки параметров также требуется MethodValidationPostProcessor bean . Если мы используем приложение Spring Boot, то этот компонент автоматически настраивается, если у нас есть зависимость hibernate-validator от нашего пути к классу.
В противном случае в стандартном приложении Spring мы должны добавить этот компонент явно:
@EnableWebMvc @Configuration @ComponentScan("com.baeldung.spring") public class ClientWebConfigJava implements WebMvcConfigurer { @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } // ... }
Любая ошибка во время проверки пути или запроса в Spring по умолчанию приводит к ответу HTTP 500. В этом уроке мы используем пользовательскую реализацию ControllerAdvice для обработки такого рода ошибок более читаемым способом и возвращаем HTTP 400 для любого плохого запроса. Исходный код этого решения можно найти на сайте GitHub.
3. Проверка параметров запроса
Давайте рассмотрим пример, когда мы передаем числовой день недели в метод контроллера в качестве параметра запроса:
@GetMapping("/name-for-day") public String getNameOfDayByNumber(@RequestParam Integer dayOfWeek) { // ... }
Наша цель состоит в том, чтобы убедиться, что значение DayOfWeek находится между 1 и 7. И для этого мы будем использовать аннотации @Min и @Max :
@GetMapping("/name-for-day") public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) { // ... }
Любой запрос, который не соответствует этим условиям, вернет HTTP status 400 с сообщением об ошибке по умолчанию.
Если мы вызовем http://| localhost:8080/name-for-day?DayOfWeek=24 , например, ответное сообщение будет:
getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7
Мы можем изменить сообщение по умолчанию, добавив пользовательское:
@Max(value = 1, message = "day number has to be less than or equal to 7")
4. Проверка вариабельности пути
Как и в случае с @ RequestParam, мы можем использовать любую аннотацию из пакета javax.validation.constraints для проверки @PathVariable .
Давайте рассмотрим пример, в котором мы проверяем, что строковый параметр не является пустым и имеет длину меньше или равную 10:
@GetMapping("/valid-name/{name}") public void createUsername(@PathVariable("name") @NotBlank @Size(max = 10) String username) { // ... }
Любой запрос с параметром name длиной более 10 символов, например, приведет к ошибке HTTP 400 с сообщением:
createUser.name:size must be between 0 and 10
Сообщение по умолчанию можно легко перезаписать, установив параметр message в аннотации @Size .
5. Заключение
В этой статье мы узнали, как проверить как параметры запроса, так и переменные пути в приложениях Spring.
Как всегда, весь исходный код доступен на GitHub .