gpt4 book ai didi

java - 如何解决 JSR-303 自定义 validator 中的依赖关系

转载 作者:行者123 更新时间:2023-11-30 02:34:59 25 4
gpt4 key购买 nike

假设有一个像这样的自定义验证注释

@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 {};
}

以及相应的 validator 需要另一个服务

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()来获取 validator 实现。因此,在 ThirdPartyConstraintValidator 的情况下,永远不会注入(inject)依赖项 ThirdPartyService

在没有任何框架的情况下使用 ValidationFactory 时,是否可以通过 setter 或构造函数将 ThirdPartyService 注入(inject)到 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;
}

最佳答案

您可以实现自定义 ConstraintValidatorFactory 来设置您的依赖项。

参见BeanVal SpecHibernate Validator Doc

Validator v = Validation.byDefaultProvider().configure()
.constraintValidatorFactory(new MyConstraintValidatorFactory())
.buildValidatorFactory()
.getValidator();

class MyConstraintValidatorFactory implements ConstraintValidatorFactory {

public <T extends ConstraintValidator<?, ?>> T getInstance(final Class<T> arg0) {
//do your stuff to set dependencies
...
}

public void releaseInstance(final ConstraintValidator<?, ?> arg0) {
...
}
}

关于java - 如何解决 JSR-303 自定义 validator 中的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com