Tengo una validación personalizada con anotaciones como:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = UniquePropertyValidator.class) public @interface UniqueProperty { String message() default "sample message"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }aquí está mi validador:
public class UniquePropertyValidator extends JdbcDaoSupport implements ConstraintValidator<UniqueProperty, UniquePropertyClass> { @Inject public UniquePropertyValidator(DataSource dataSource) { setDataSource(dataSource); } @Override public void initialize(UniqueProperty property) { } @Override public boolean isValid(UniquePropertyClass propertyClass, ConstraintValidatorContext constraintValidatorContext) { return some boolean; } }y estoy tratando de usarlo de la siguiente manera:
SpringValidatorAdapter adapter = new SpringValidatorAdapter(validator); BeanPropertyBindingResult result = new BeanPropertyBindingResult(propertyClass, propertyClass.getClass().getName()); adapter.validate(propertyClass, result, UniquePropertyClass.SomeValidationGroup.class); if (result.hasErrors()) throw new MethodArgumentNotValidException(null, result);sin embargo, recibo este error:
HV000064: Unable to instantiate ConstraintValidator: class some.package.UniquePropertyValidator.Ahora, soy muy consciente de que mi clase de validador no tiene un constructor predeterminado sin ningún parámetro de método. Sin embargo, lo siguiente funciona con la anotación y el validador exactos:
public someMethod(@Validated(value = UniquePropertyClass.SomeValidationGroup.class) @RequestBody UniquePropertyClass propertyClass)Lo que estoy preguntando es; ¿Hay alguna forma de validar manualmente sin el constructor predeterminado?
PD: la razón por la que no puedo usar @Validated (el ejemplo de trabajo anterior) es:
Tengo un @PathVariable (digamos id ) y antes de validar el objeto @RequestBody UniquePropertyClass propertyClass , necesito establecer el id del objeto UniquePropertyClass antes de validarlo, ya que no pude encontrar una manera de vincular el @PathVariable en el campo @RequestBody y validarlo en la mosca con @Validated . Entonces, dar una pista sobre cómo hacer que esto funcione también sería una respuesta perfectamente aceptable.
¡Gracias!
Cree un constructor predeterminado para UniquePropertyValidator y agregue la anotación @Component. Entonces solo agrega
@Inject private DataSource dataSource;para inyectar la fuente de datos en lugar de iniciarla desde Constructor. (Ver más para objetos de cableado automático en el validador )
ACTUALIZAR puede obtener el bean del contexto (consulte Spring get current ApplicationContext )