【发布时间】:2017-04-10 15:16:47
【问题描述】:
假设有一个像这样的自定义验证注解
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ThirdPartyConstraintValidator.class})
@Documented
public @interface ThirdPartyConstraint {
String message() default "Invalid";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
以及需要其他服务的相应验证器
public class ThirdPartyConstraintValidator implements ConstraintValidator<ThirdPartyConstraint, Pojo> {
private ThirdPartyService thirdPartyService;
@Override
public void initialize(ThirdPartyConstraint thirdPartyConstraint) {}
@Override
public boolean isValid(Pojo pojo, ConstraintValidatorContext constraintValidatorContext) {
return thirdPartyService.isValid(pojo);
}
public void setThirdPartyService(ThirdPartyService thirdPartyService) {
this.thirdPartyService = thirdPartyService;
}
}
验证上下文是用这样的 Hibernate 实现初始化的
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// and then some bean is validated
validator.validate(new Pojo());
在后台validate 方法调用class.newInstance() 以获取验证器实现。所以,对于ThirdPartyConstraintValidator,永远不会注入依赖ThirdPartyService。
在没有任何框架的情况下使用ValidationFactory 时,有没有办法通过setter 或构造函数将ThirdPartyService 注入ThirdPartyConstraintValidator?
更新:
在@matthias 回答之后,我更新了我的ValidatorFactory 以在其中初始化ThirdPartyConstraintValidator
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> aClass) {
if (ThirdPartyConstraintValidator.class.equals(aClass)) {
ThirdPartyConstraintValidator thirdPartyConstraintValidator = new ThirdPartyConstraintValidator();
thirdPartyConstraintValidator.setThirdPartyService(new ThirdPartyService());
return (T) thirdPartyConstraintValidator;
}
return null;
}
【问题讨论】:
-
尝试将
@Autowired添加到private ThirdPartyService thirdPartyService; -
@HJz 谁说我用的是Spring?
标签: java hibernate validation bean-validation