Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Bean Validation - PARAMETER

Pessoal, bom dia.

Colocando em prática os estudos, estou com dificuldade no seguinte cenário:

Fiz um CRUD de funcionário, onde em algumas situações preciso validar se a empresa que o funcionário será cadastrado existe. Como a validação será em mais de um ponto, então criei a anotação @ValidEmpresa:

@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ValidEmpresaValidator.class)
public @interface ValidEmpresa {

    String message() default "Não localizado!";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

}

Validator

public class ValidEmpresaValidator implements ConstraintValidator<ValidEmpresa, Integer> {

    @Autowired
    private EmpresaRepository empresaRepository;

    private String mensagem;

    @Override
    public void initialize(ValidEmpresa constraintAnnotation) {
        this.mensagem = constraintAnnotation.message();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {


        if (value == null || value < 1) {

            return false;
        }

        if (this.empresaRepository.findById(value).isEmpty()) {
            throw new ObjectNotFoundException(this.mensagem, "codEmpresa ");
        }

        return true;
    }


}

Quando utilizado anotação no atributo ou método get da classe FuncionarioForm, funciona perfeito, mas caso tento usar no parâmetro de método da classe controller, não funciona.

Cheguei alterar anotação deixando apenas ElementType.PARAMETER e na classe ValidEmpresaValidator adicionei anotação @SupportedValidationTarget(ValidationTarget.PARAMETERS), mesmo assim não funcionou.

Este é o ponto que gostaria de validar:

/**
     * 
     * @param paginacao
     * @parm código da empresa
     * @return Todos os usuários da empresa consultada, de acordo com a paginação.
     */
@GetMapping("/empresa/{id}")
    public Page<FuncionarioDto> findAllEmpresa(@PathVariable @Valid @ValidEmpresa Integer id,
            @PageableDefault(sort = "id") Pageable paginacao) {
        return FuncionarioDto.convert(this.repository.findByEmpresasId(id, paginacao));

    }

Por favor alguém poderia me orientar nesse cenário.

Desde já agradeço atenção!

2 respostas
solução!

Thiago, tenta anotar a classe Controller com @Validated. Me avisa se deu certo.

Olá José Guilherme, boa tarde.

Deu certo, obrigado pela dica!