2017-04-13 53 views
3

我有一个注释,如自定义验证验证:手动与无默认构造函数自定义验证

@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对象之前,我需要验证之前,设置UniquePropertyClass对象的id,因为我做不到找到一种方法将@PathVariable绑定到@RequestBody字段中,并通过@Validated即时验证。因此,提示如何使这项工作也将是一个完全可以接受的答案。

谢谢!

回答

0

为UniquePropertyValidator创建默认构造函数并添加@Component注释。然后,只需添加

@Inject 
private DataSource dataSource; 

注入数据源而不是init从构造函数中注入。 (查看更多的autowiring objects in validator

UPDATE你可以从上下文中的豆(见 Spring get current ApplicationContext

+0

不春天总是与'adapter.validate创建一个新的实例(propertyClass,结果,UniquePropertyClass.SomeValidationGroup.class );'而不是在使用'@ Component'时使用应用程序上下文中存在的那个?或者它只会创建一个新的应用程序,因为它在应用程序上下文中找不到一个? –

+0

它使用了应用程序上下文中的一个,而不是创建一个新的。谢谢! –

+0

对不起,我忘记了'clean'和'install'它试图创建一个新的而不是使用应用程序上下文中的那个,而'dataSource'是空的,因为新创建的不是由弹簧。也许我可以使用'@ Configurable'? –

相关问题