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

标签 java spring validation spring-mvc hibernate-validator

我对 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/

相关文章:

java - 由于访问权限不足,无法添加 LDAP : error code 50 - The entry uid=test@info. com,ou=People,o=Drive,dc=company,dc=com

asp.net - .NET 4 上的 "A potentially dangerous Request.Path found...",requestValidationMode= "2.0"和 validateRequest= "false"设置

html - 更正 span 标签中的自动换行

java - 在Mapreduce中,我想知道是否有某种方法可以使用java使用2个csv文件

java - java程序启动时会发生什么?

java - Tomcat(外部而非服务器运行时)是否适用于 JDK 11

java - spring-kafka 如何在后台运行消费者

java - 无法访问在特定机器上运行的Web应用程序

spring - 错误 : cannot execute nextval() in a read-only transaction - PostgreSQL

regex - 正则表达式识别电子邮件地址难吗?