Recentemente tive o prazer de voltar a trabalhar com a especificação JSR-303, um projeto simples, mas com alguns pontos bem interessantes de validação, optamos por usar Bean Validation, pois seria o caminho mais simples para validar nossos inputs de uma forma não tão intrusiva. Nesse posts veremos alguns exemplos de validações em endpoints REST, de casos simples aos mais complexos, utilizaremos Spring Boot + Jax-RS(com Jersey), assim evitaremos perder tempo com configurações.
O projeto pode ser baixado no seguinte link
# Validando parametros
Sem mais delongas, vamos começar usando os validadores "default" da JSR-303, faremos a validação de um endpoint GET simples, nesse endpoint devemos buscar um usuário pelo seu ID, sendo o ID um 'Query Param' obrigatório. Você pode ver o código completo aqui
Veja que podemos validar parâmetros do nosso endpoint, com essas anotações validá-mos os parámetros 'Required' no caso o 'limit', e também os valores válidos para o mesmo '@Range(min=1,max=50)', não é necessário explicação os nomes são bem intuitivos. No caso do parámetro 'page' ele também será validado, apenas se, ele for informado, caso não, receberá o valor default. Abaixo um exemplo de response.
Note que a anotação @Range não faz parte da spec JSR-303, ela faz parte da implementação do Hibernate. Um resultado semelhante pode ser atingido usando @Min e @Max
# Validação customizada
A especificação JSR-303 também permite que eu crée minha própria validação, claro, é necessário seguir algumas regras, sua anotação deve fornecer alguns atributos básicos(message, groups, payload), sendo que groups, deve ter um valor default vazio({}). Vamos ver um exemplo prático, vamos criar uma anotação para validar se o ID de um usuário existe, iremos criar uma anotação como a seguir.
Note que devemos informar o valor no atributo 'validatedBy', apontando para uma classe, na anotação '@Constraint', essa classe deve obrigatoriamente extender 'ConstraintValidator'. Veja a seguir
Podemos então criar nosso endpoint para retornar um usuário existente.
Com isso concluímos a primeira parte do tópico sobre validações, a seguir veremos algumas validações mais complexas, como Cross-Field e Compose Validations e validações de grupos.