将服务自动装配到验证器中 [英] Autowiring a service into a validator
问题描述
这个例子有些人为的.我已对其进行了简化,以删除多余的细节并专注于我遇到的问题.我有一个看起来像这样的验证器:
This example is a bit contrived; I've simplified it to remove extraneous details and to focus on the problem I am having. I have a validator that looks like this:
@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
UsernameService usernameService;
@Override
public void initialize(UniqueUsername uniqueUsername) {
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !usernameService.exists(s);
}
}
我从控制器中调用验证器,如下所示:
I call the validator from my controller like this:
@RequestMapping
public void checkUsername(Model model, User user) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
model.addAttribute("error", constraintViolations.size() > 0);
}
但是,我一直收到NullPointerException
异常.我在验证器中添加了一个断点,并看到usernameService
是null
.为什么不自动接线?最初,我认为这是因为我没有使用@Component
注释验证器,但是即使在注释了它之后,我仍然遇到相同的问题. UsernameService
类已经用@Service
进行了注释,我可以验证其构造函数是否已被调用.
However, I keep getting an NullPointerException
exception. I added a breakpoint in my validator and saw that usernameService
was null
. Why isn't it getting autowired? Initially I thought it was because I hadn't annotated the validator with @Component
, but I still have the same problem even after annotating it. The UsernameService
class has already been annotated with @Service
and I can verify that its constructor is getting called.
我是Spring的新手,所以我什至不确定是否可以将服务连接到验证程序.我在做什么错了?
I am new to Spring, so I'm not even sure if it is alright to wire a service into a validator. What am I doing wrong?
推荐答案
在Spring中,您需要通过LocalValidatorFactoryBean
而不是Validation.buildDefaultValidatorFactory()
来获取ValidatorFactory
(或Validator
本身),如 .
In Spring, you need to obtain ValidatorFactory
(or Validator
itself) via LocalValidatorFactoryBean
instead of Validation.buildDefaultValidatorFactory()
, as described in the reference.
@Autowired
Validator validator;
@RequestMapping
public void checkUsername(Model model, User user) {
Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
model.addAttribute("error", constraintViolations.size() > 0);
}
-
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
编辑:但是也许更好的方法是使用带有@Valid
批注的Spring MVC的自动验证:
But perhaps the better way to do it is to use Spring MVC's automatic validation with @Valid
annotation:
@RequestMapping
public void checkUsername(Model model, @Valid User user, BindingResult result) {
if (result.hasErrors()) {
...
}
}
这还需要配置中的<mvc:annotation-driven/>
.
这篇关于将服务自动装配到验证器中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!