Validando RequestParams e PathVariables no Spring
1. Introdução
Neste tutorial, vamos dar uma olhada em como validar parâmetros de solicitação HTTP e variáveis de caminho no Spring MVC.
Especificamente, validaremosString eNumber parameters comJSR 303 annotations.
Para explorar a validação de outros tipos, consulte nossos tutoriais sobreJava Bean Validationemethod constraints ou aprenda comocreate your own validator.
2. Configuração
Para usar a API de validação Java, temos que adicionar uma implementação JSR 303, comohibernate-validator:
org.hibernate.validator
hibernate-validator
6.0.10.Final
Além disso,we have to enable validation for both request parameters and path variables in our controllers by adding the @Validated annotation:
@RestController
@RequestMapping("/")
@Validated
public class Controller {
// ...
}
É importante observar queenabling parameter validation also requires a MethodValidationPostProcessor bean. Se estivermos usando um aplicativo Spring Boot, este bean será configurado automaticamente se tivermos a dependênciahibernate-validator em nosso classpath.
Caso contrário, em um aplicativo Spring padrão, temos que adicionar este bean explicitamente:
@EnableWebMvc
@Configuration
@ComponentScan("com.example.spring")
public class ClientWebConfigJava implements WebMvcConfigurer {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
// ...
}
Qualquer erro durante a validação de caminho ou solicitação no Spring resulta por padrão em uma resposta HTTP 500. Neste tutorial, usamos uma implementação personalizada deControllerAdvice para lidar com esse tipo de erro de uma maneira mais legível e retornar HTTP 400 para qualquer solicitação incorreta. Você pode encontrar o código-fonte desta solução emGitHub.
3. Validando umRequestParam
Vamos considerar um exemplo em que passamos um dia da semana numérico para um método controlador como um parâmetro de solicitação:
@GetMapping("/name-for-day")
public String getNameOfDayByNumber(@RequestParam Integer dayOfWeek) {
// ...
}
Nosso objetivo é ter certeza de que o valor dedayOfWeek está entre 1 e 7. E para fazer isso, usaremos as anotações@Mine@Max:
@GetMapping("/name-for-day")
public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {
// ...
}
Qualquer solicitação que não corresponda a essas condições retornará o status HTTP 400 com uma mensagem de erro padrão.
Se chamarmoshttp://localhost:8080/name-for-day?dayOfWeek=24, por exemplo, a mensagem de resposta será:
getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7
Podemos alterar a mensagem padrão adicionando uma mensagem personalizada:
@Max(value = 1, message = “day number has to be less than or equal to 7”)
4. Validando umPathVariable
Assim como com @RequestParam,, podemos usar qualquer anotação do pacotejavax.validation.constraints para validar@PathVariable.
Vamos considerar um exemplo em que validamos que um parâmetro String não está em branco e tem um comprimento menor ou igual a 10:
@GetMapping("/valid-name/{name}")
public void createUsername(@PathVariable("name") @NotBlank @Size(max = 10) String username) {
// ...
}
Qualquer solicitação com um parâmetroname maior que 10 caracteres, por exemplo, resultará em um erro HTTP 400 com uma mensagem:
createUser.name:size must be between 0 and 10
A mensagem padrão pode ser facilmente substituída configurando o parâmetromessage na anotação@Size.
5. Conclusão
Neste artigo, aprendemos como validar parâmetros de solicitação e variáveis de caminho em aplicativos Spring.
Como sempre, todo o código-fonte está disponível emGitHub.