gpt4 book ai didi

Java Dropwizard 初始化 ConstraintValidator

转载 作者:行者123 更新时间:2023-12-02 01:55:57 26 4
gpt4 key购买 nike

假设我有一个自定义 ConstraintValidator:

public class FooValidator implements ConstraintValidator<ValidFoo, String> {
@Override
public void initialize(final ValidFoo foo) {
// No-op
}

@Override
public boolean isValid(final String foo, final ConstraintValidatorContext context) {

}
}

我希望能够通过 Dropwizard runinitialize 中的 ServiceConfiguration 传递一些配置来初始化此类。

这可能吗?

最佳答案

首先,值得注意的是即将发布的 Dropwizard 2.0.0 版本有 built in support for this

<小时/>

目前,该过程有点复杂。您基本上想要重新引导 Hibernate 验证,但使用支持注入(inject)的自定义约束 validator 工厂。

它将涉及大约 4 个自定义类,所以请耐心等待。这里是:

首先,我们首先注册一个自定义功能,将此功能包装到我们的 Application 类中:

public void run(MainConfiguration config, Environment environment) throws Exception {
// ...
environment.jersey().register(InjectingValidationFeature.class);
}

现在我们定义该功能:InjectingValidationFeature - 它基本上在服务容器中注册我们的自定义实现:

public class InjectingValidationFeature implements Feature {

@Override
public boolean configure(FeatureContext context) {
context.register(new AbstractBinder() {
@Override
protected void configure() {
bindFactory(ValidatorFactory.class).to(Validator.class).in(Singleton.class);
bind(InjectingConfiguredValidator.class).to(ConfiguredValidator.class).in(Singleton.class);
bind(InjectingConstraintValidatorFactory.class).to(ConstraintValidatorFactory.class).in(Singleton.class);
}
});

return true;
}
}

现在我们定义上面注册的那些类。让我们从核心部分开始,InjectingConstraintValidatorFactory,Hibernate Validator 将实际使用它来创建约束 validator 。请注意,因为我们正在容器中注册它们,所以我们实际上已经可以开始注入(inject)东西了,这是我们的自定义 ConstraintValidatorFactory,它利用服务定位器来使依赖项注入(inject)成为可能:

public class InjectingConstraintValidatorFactory implements ConstraintValidatorFactory {

private final ServiceLocator serviceLocator;

@Inject
public InjectingConstraintValidatorFactory(ServiceLocator serviceLocator) {
this.serviceLocator = serviceLocator;
}

@Override
public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) {
return this.serviceLocator.createAndInitialize(key);
}

@Override
public void releaseInstance(ConstraintValidator<?, ?> instance) {
this.serviceLocator.preDestroy(instance);
}
}

现在我们的中心 javax.validation.Validator 接口(interface)工厂:

public class ValidatorFactory implements Factory<Validator> {

private final ConstraintValidatorFactory constraintValidatorFactory;

@Inject
public ValidatorFactory(ConstraintValidatorFactory constraintValidatorFactory) {
this.constraintValidatorFactory = constraintValidatorFactory;
}

@Override
public Validator provide() {
return Validation.byDefaultProvider().configure().constraintValidatorFactory(
this.constraintValidatorFactory).buildValidatorFactory()
.getValidator();
}

@Override
public void dispose(Validator instance) {
// Nothing
}
}

最后,我们的 InjectingConfiguredValidator,请注意它如何仅使用 DropwizardConfiguredValidator,但使用 @Inject 这将允许我们从以下位置接收 validator 我们上面的 ValidatorFactory:

public class InjectingConfiguredValidator extends DropwizardConfiguredValidator {
@Inject
public InjectingConfiguredValidator(Validator validator) {
super(validator);
}
}

就是这样。通过上述内容,我们成功地在 Jersey 中注册了一个注入(inject)感知的 Validator ,并注册到我们的服务容器中,这样您也可以在任何地方 @Inject Validator 并按照您喜欢的方式使用它.

关于Java Dropwizard 初始化 ConstraintValidator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52284731/

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