gpt4 book ai didi

java - 在约束 validator 中使用 Guice 进行依赖注入(inject)

转载 作者:行者123 更新时间:2023-11-30 06:48:58 25 4
gpt4 key购买 nike

我有一个在 ConstraintValidator 实现中注入(inject)类的用例。我正在使用 Google guice 进行依赖注入(inject),目前无法在 validator 中注入(inject)。

我的场景的简化形式

内部模块:

@Provides
@Singleton
public ServiceA getServiceA() {
return new ServiceA();
}

约束 validator :

public class MyValidator implements ConstraintValidator<ValidS,List<String>> {

private final ServiceA serviceA;

@Inject
public MyValidator(ServiceA serviceA) {
this.serviceA = serviceA;
}
@Override
public void initialize(final ValidS validS) {
}

@Override
public boolean isValid(final List<String> sList, final ConstraintValidatorContext constraintValidatorContext) {
System.out.println(serviceA.testInjection());
//validation code
}


}

编辑:添加异常消息:

HV000064: Unable to instantiate ConstraintValidator: class com.validation.MyValidator.
javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: class com.validation.MyValidator.
at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:51) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.util.ReflectionHelper.run(ReflectionHelper.java:671) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.util.ReflectionHelper.newInstance(ReflectionHelper.java:219) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl.getInstance(ConstraintValidatorFactoryImpl.java:34) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.createAndInitializeValidator(ConstraintValidatorManager.java:141) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.getInitializedValidator(ConstraintValidatorManager.java:101) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:125) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:478) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:424) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:388) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:340) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:158) ~[hibernate-validator-5.0.1.Final.jar:5.0.1.Final]
at com.MyClass.validate(MyClass.java:48)

最佳答案

Hibernate 无法实例化您的自定义 validator ,因为 Hibernate 期望 validator 具有无参数构造函数 (hibernate docs) :

The default ConstraintValidatorFactory provided by Hibernate Validator requires a public no-arg constructor to instantiate ConstraintValidator instances (see The constraint validator).

所以你基本上有两种可能性:

  1. 实现自定义 ConstraintValidatorFactory,这在链接文档中有描述,在该工厂中,访问 guice 注入(inject)器以获取 ServiceA 并通过它给构造函数。

  2. 删除 public MyValidator(ServiceA serviceA) 构造函数并尝试从 public void initialize(final ValidS validS) 中初始化对 ServiceA 的引用)方法。在这里,您还需要获得 guice 注入(inject)器。

要获得注入(inject)器,您可以执行以下操作(这不是很好的代码,但您需要以某种方式访问​​注入(inject)器)。要存储您的注入(inject)器引用,您可以使用单例 - 在这里我通过使用枚举来实现它:

public enum GlobalInjector {
INSTANCE;
private Injector injector;
public Injector getInjector() {
return injector;
}
public void setInjector(Injector injector) {
this.injector = injector;
}
}

我不知道你是如何初始化guice的,但你可能有这样的代码,所以添加代码来存储注入(inject)器:

Injector injector = Guice.createInjector(new ConfigurationModule());
GlobalInjector.INSTANCE.setInjector(injector);

那么你的初始化方法应该是这样的:

@Override
public void initialize(final ValidS validS) {
Injector injector = GlobalInjector.INSTANCE.getInjector();
if(null != injector) {
serviceA = injector.getInstance(ServiceA.class);
}
}

不要忘记检查 GlobalInjector.INSTANCE.getInjector(); 是否返回 null,并且在调用验证方法时,确保 serviceA 不为 null .

注意:我个人不喜欢将注入(inject)器存储为全局变量(由单例伪装)的想法,但目前,我没有更好的主意。此代码未经测试,所以我希望它能按预期工作。

关于java - 在约束 validator 中使用 Guice 进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43485410/

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