使用没有默认构造函数的自定义验证器手动验证
Manually validate with a custom validator without default constructor
我有一个带有注释的自定义验证,例如:
@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 {};
}
这是我的验证器:
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; }
}
我正在尝试按如下方式使用它:
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);
但是我收到了这个错误:
HV000064: Unable to instantiate ConstraintValidator: class some.package.UniquePropertyValidator.
现在,我很清楚我的验证器 class 没有没有任何方法参数的默认构造函数。但是,以下内容适用于确切的注释和验证器:
public someMethod(@Validated(value = UniquePropertyClass.SomeValidationGroup.class) @RequestBody UniquePropertyClass propertyClass)
我要问的是;有没有办法在没有默认构造函数的情况下手动验证。
P.S。我不能使用 @Validated
(上面的工作示例)的原因是:
我有一个@PathVariable
(比如说id
),在验证@RequestBody UniquePropertyClass propertyClass
对象之前,我需要在验证之前设置UniquePropertyClass
对象的id
它,因为我找不到将 @PathVariable
绑定到 @RequestBody
字段并使用 @Validated
即时验证的方法。因此,给出有关如何完成这项工作的提示也是一个完全可以接受的答案。
谢谢!
为 UniquePropertyValidator 创建默认构造函数并添加 @Component 注释。然后只需添加
@Inject
private DataSource dataSource;
注入数据源而不是从构造函数初始化它。 (查看更多autowiring objects in validator)
更新您可以从上下文中获取 bean(请参阅
Spring get current ApplicationContext )
我有一个带有注释的自定义验证,例如:
@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 {};
}
这是我的验证器:
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; }
}
我正在尝试按如下方式使用它:
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);
但是我收到了这个错误:
HV000064: Unable to instantiate ConstraintValidator: class some.package.UniquePropertyValidator.
现在,我很清楚我的验证器 class 没有没有任何方法参数的默认构造函数。但是,以下内容适用于确切的注释和验证器:
public someMethod(@Validated(value = UniquePropertyClass.SomeValidationGroup.class) @RequestBody UniquePropertyClass propertyClass)
我要问的是;有没有办法在没有默认构造函数的情况下手动验证。
P.S。我不能使用 @Validated
(上面的工作示例)的原因是:
我有一个@PathVariable
(比如说id
),在验证@RequestBody UniquePropertyClass propertyClass
对象之前,我需要在验证之前设置UniquePropertyClass
对象的id
它,因为我找不到将 @PathVariable
绑定到 @RequestBody
字段并使用 @Validated
即时验证的方法。因此,给出有关如何完成这项工作的提示也是一个完全可以接受的答案。
谢谢!
为 UniquePropertyValidator 创建默认构造函数并添加 @Component 注释。然后只需添加
@Inject
private DataSource dataSource;
注入数据源而不是从构造函数初始化它。 (查看更多autowiring objects in validator)
更新您可以从上下文中获取 bean(请参阅 Spring get current ApplicationContext )