gpt4 book ai didi

java - Autowired 在自定义约束 validator 中给出 Null 值

转载 作者:IT老高 更新时间:2023-10-28 13:48:59 24 4
gpt4 key购买 nike

我对 Spring 完全陌生,对于所提出的问题,我已经查看了一些关于 SO 的答案。以下是链接:

Spring 3.1 Autowiring does not work inside custom constraint validator

Autowiring a service into a validator

Autowired Repository is Null in Custom Constraint Validator

我有一个 Spring 项目,我想在其中使用 Hibernate Validator 进行对象验证。根据我在网上阅读的内容和一些论坛,我尝试如下注入(inject) validator :

@Bean
public Validator validator() {
return new LocalValidatorFactoryBean().getValidator();
}

但无论我在哪里使用

@Autowired
Validator validator;

它采用 Spring 的 validator 实现而不是 Hibernate 的 validator 。我不知道如何准确地注入(inject) Hibernate validator 并简单地将其 Autowiring 到其他类中,所以我使用了一个便宜的技巧,现在我的 Java Config 看起来像这样

@Bean
public Validator validator() {
// ValidatorImpl is Hibernate's implementation of the Validator
return new ValidatorImpl();
}

(如果有人能指出我如何避免以这种 Hacky 方式获取 Hibernate Validator,我将不胜感激)

但是让我们来看看这里的主要问题:

这是自定义验证定义

@Target( { METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER } )
@Retention(RUNTIME)
@Constraint(validatedBy = EmployeeValidator.class)
@Documented
public @interface EmployeeValidation {
String message() default "{constraints.employeeConstraints}";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() default {};
}

我的自定义 validator

public class EmployeeValidator implements ConstraintValidator<EmployeeValidation , Object> {

@Autowired
private EmployeeService employeeService;

@Override
public void initialize(EmployeeValidation constraintAnnotation) {
//do Something
}

@Override
public boolean isValid(String type, ConstraintValidatorContext context) {
return false;
}
}

在上面的自定义约束 validator 中,employeeService 为空。我知道当 Spring 启动时不会实例化 ConstraintValidator 的任何实现,但我认为添加 ValidatorImpl() 实际上会解决这个问题。但它没有。

现在我遇到了一个非常老套的解决方法,我不想继续使用这样的代码。有人可以帮我解决我的情况。

附:这些是我在 Java Config 文件中的导入:

import org.hibernate.validator.HibernateValidator; 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.core.env.Environment;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

最佳答案

我希望解决方案对某人有所帮助:

@Bean
public Validator validator () {

ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();

return validator;
}

使用 SpringConstraintValidatorFactory 初始化 validator 以便注入(inject)工作并提供 validator 实现为 Hibernate.class 以下列方式工作:

  1. 您的对象将由您选择的库进行验证
  2. 您的自定义 validator 将能够使用 Spring 的功能,同时让 Hibernate 执行验证。

它是如何工作的: hibernate 的ConstraintValidatorFactory不初始化任何 ConstraintValidators除非他们被称为但 SpringConstraintValidatorFactory通过给 AutowireCapableBeanFactory给它。

编辑

正如@shabyasaschi 的评论之一所述注入(inject) autowireCapableBeanFactory您可以将方法签名更改为:

Validator validator(final AutowireCapableBeanFactory autowireCapableBeanFactory) {

或者在配置文件中为其添加getter和setter,如下:

public AutowireCapableBeanFactory getAutowireCapableBeanFactory() {
return autowireCapableBeanFactory;
}

public void setAutowireCapableBeanFactory(AutowireCapableBeanFactory autowireCapableBeanFactory) {
this.autowireCapableBeanFactory = autowireCapableBeanFactory;
}

关于java - Autowired 在自定义约束 validator 中给出 Null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37958145/

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