使用没有默认构造函数的自定义验证程序手动验证

时间:2017-04-13 08:43:55

标签: java spring validation spring-boot javax

我有一个带注释的自定义验证,例如:

@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.

现在,我很清楚我的验证器类没有没有任何方法参数的默认构造函数。但是,以下内容适用于确切的注释和验证器:

public someMethod(@Validated(value = UniquePropertyClass.SomeValidationGroup.class) @RequestBody UniquePropertyClass propertyClass)

我要问的是;有没有一种方法可以在没有默认构造函数的情况下手动验证。

P.S。我无法使用@Validated(上面的工作示例)的原因是:

我有一个@PathVariable(比如id),在验证@RequestBody UniquePropertyClass propertyClass对象之前,我需要在验证之前设置id UniquePropertyClass对象,因为我找不到将@PathVariable绑定到@RequestBody字段并使用@Validated动态验证的方法。因此,提示如何使这项工作也是一个完全可以接受的答案。

谢谢!

1 个答案:

答案 0 :(得分:0)

为UniquePropertyValidator创建默认构造函数并添加@Component批注。然后添加

@Inject
private DataSource dataSource;

注入数据源而不是从Constructor初始化它。 (查看autowiring objects in validator

的更多信息

更新你可以从上下文中获取bean(参见 Spring get current ApplicationContext