Перейти к основному содержимому

Проверка RequestParams и PathVariables в Spring

· 3 мин. чтения

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 .