Autowired在“自定义约束”验证器中给出Null值

我对Spring完全陌生,因此已经针对所问问题在SO上找到了一些答案。这里是链接:

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

@Bean

public Validator validator() {

return new LocalValidatorFactoryBean().getValidator();

}

但是无论我在哪里使用

@Autowired

Validator validator;

它采用了Spring的验证器实现,而不是Hibernate的验证器。我不知道如何准确地注入Hibernate验证程序,并简单地将其自动连接到其他类上,所以我使用了便宜的技巧,现在我的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 {};

}

我的自定义验证器

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;

}

}

在上面的自定义约束验证器中,我获得了employeeService null。我知道在Spring启动时不会实例化ConstraintValidator的任何实现,但是我认为添加ValidatorImpl()可以真正解决该问题。但事实并非如此。

现在,我陷入了一个非常棘手的解决方法,并且我不想继续使用这样的代码。有人可以帮我解决我的情况吗?

PS这些是我在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以便注入能够工作,并将验证器实现提供为Hibernate.class的工作方式如下:

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

工作原理:除非被调用,否则Hibernate ConstraintValidatorFactory不会初始化任何东西ConstraintValidators,而是SpringConstraintValidatorFactory通过给予AutowireCapableBeanFactory它来初始化。

编辑

如@shabyasaschi的评论之一所述,要注入,autowireCapableBeanFactory你可以将方法签名更改为:

Validator validator(final AutowireCapableBeanFactory autowireCapableBeanFactory) {

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

public AutowireCapableBeanFactory getAutowireCapableBeanFactory() {

return autowireCapableBeanFactory;

}

public void setAutowireCapableBeanFactory(AutowireCapableBeanFactory autowireCapableBeanFactory) {

this.autowireCapableBeanFactory = autowireCapableBeanFactory;

}

以上是 Autowired在“自定义约束”验证器中给出Null值 的全部内容, 来源链接: utcz.com/qa/411778.html

回到顶部