1. Введение
В этом руководстве мы рассмотрим, как проверять параметры HTTP-запроса и переменные пути в Spring MVC.
В частности, мы проверим параметры String
и Number
с помощью аннотаций JSR 303 .
Чтобы изучить валидацию других типов, обратитесь к нашим руководствам по валидации Java Bean и ограничениям методов или узнайте, как создать свой собственный валидатор .
2. Конфигурация
Чтобы использовать Java Validation API, мы должны добавить реализацию JSR 303, такую как hibernate-validator
:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.10.Final</version>
</dependency>
Кроме того, мы должны включить проверку как параметров запроса, так и переменных пути в наших контроллерах, добавив аннотацию @Validated
:
@RestController
@RequestMapping("/")
@Validated
public class Controller {
// ...
}
Важно отметить, что для включения проверки параметров также требуется bean- компонент MethodValidationPostProcessor
. Если мы используем приложение Spring Boot, то этот bean-компонент настраивается автоматически, если у нас есть зависимость hibernate-validator
от нашего пути к классам.
В противном случае в стандартном приложении Spring мы должны явно добавить этот компонент:
@EnableWebMvc
@Configuration
@ComponentScan("com.foreach.spring")
public class ClientWebConfigJava implements WebMvcConfigurer {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
// ...
}
Любая ошибка во время проверки пути или запроса в Spring по умолчанию приводит к ответу HTTP 500. В этом руководстве мы используем пользовательскую реализацию ControllerAdvice
, чтобы обрабатывать такие ошибки более читабельным способом и возвращать HTTP 400 для любого неверного запроса. Вы можете найти исходный код этого решения на GitHub.
3. Проверка RequestParam
Давайте рассмотрим пример, когда мы передаем числовой день недели в метод контроллера в качестве параметра запроса:
@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 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. Проверка PathVariable
Как и в случае с @RequestParam,
мы можем использовать любую аннотацию из пакета javax.validation.constraints
для проверки @PathVariable
.
Давайте рассмотрим пример, в котором мы проверяем, что параметр String не является пустым и имеет длину меньше или равную 10:
@GetMapping("/valid-name/{name}")
public void createUsername(@PathVariable("name") @NotBlank @Size(max = 10) String username) {
// ...
}
Например, любой запрос с параметром имени
длиннее 10 символов приведет к ошибке HTTP 400 с сообщением:
createUser.name:size must be between 0 and 10
Сообщение по умолчанию можно легко перезаписать, установив параметр сообщения
в аннотации @Size
.
5. Вывод
В этой статье мы узнали, как проверять как параметры запроса, так и переменные пути в приложениях Spring.
Как всегда весь исходный код доступен на GitHub .