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!