【问题标题】:Custom Spring Validator Doesn't Get Injected自定义 Spring 验证器不会被注入
【发布时间】:2020-11-10 21:01:51
【问题描述】:

问题是这样的: 使用 Spring Boot,我有一个休眠实体(消息),我想为它创建一个自定义验证器。

import org.springframework.validation.Validator;
        
@Component
public class MessageValidator implements Validator {
@Override
    public boolean supports(Class<?> clazz) {
        return Message.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
    ... Do work here ...
    }
}

那么,我有一个服务

@Service
public class MessagesService {

    @Autowired
    Validator validator;

    public void doSomething(Message m) {
        Errors e = new BeanPropertyBindingResult(new Object(), "dummy");
        this.validator.validate(m, e);
    }
}

问题在于调用 this.validator.validate(m, e);永远不会进入我的实现。

我的 pom.xml 有(以及其他):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

那么,我是否在这里遗漏了一些明显的东西?如果我命名验证器组件并且我限定了服务中的引用,那么一切都很好。但我希望 Spring 接线能够为我要求的对象类型提供适当的验证器。还是这个期望太高了?

【问题讨论】:

    标签: java spring validation spring-validator


    【解决方案1】:

    问题一定出在你的自动装配上。

    由于您在这里使用接口,它可以自动装配默认(Spring 提供的实现之一)实例。

      @Autowired
      Validator validator;
    

    解决方案:

    1. 使用MessageValidator 而不是Validator
        @Autowired
        MessageValidator validator;
    

    或者 2. 使用限定名:

        @Autowired
        @Qualifier(value = "messageValidator") //note lowercase m
        Validator validator;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2013-06-12
    相关资源
    最近更新 更多