Java 当自定义验证器用@Component注释时,JSR-303验证将被忽略

Java 当自定义验证器用@Component注释时,JSR-303验证将被忽略,java,spring,validation,spring-boot,bean-validation,Java,Spring,Validation,Spring Boot,Bean Validation,我注意到,在Spring中,当声明使用@Component注释的自定义验证器bean时,JSR-303验证被完全忽略。有趣的是,自定义验证器甚至不需要任何类填写或使用。Spring扫描其组件的事实似乎足以让Spring在对象绑定期间跳过JSR-303验证。从自定义验证器中删除@组件,然后重新启动web应用程序,即可按预期启用JSR-303验证。使用@Component注释自定义验证器有其用途,例如使用Spring Autowire依赖项 考虑下面的简单示例: /*简单JSR-303注释用户对象*

我注意到,在Spring中,当声明使用
@Component
注释的自定义验证器bean时,JSR-303验证被完全忽略。有趣的是,自定义验证器甚至不需要任何类填写或使用。Spring扫描其组件的事实似乎足以让Spring在对象绑定期间跳过JSR-303验证。从自定义验证器中删除
@组件
,然后重新启动web应用程序,即可按预期启用JSR-303验证。使用
@Component
注释自定义验证器有其用途,例如使用Spring Autowire依赖项

考虑下面的简单示例:

/*简单JSR-303注释用户对象*/
公共类用户{
@大小为NotNull时(最小值=2,最大值=5)
受保护的字符串用户名;
@尺寸(最小值=2,最大值=32)
受保护的字符串名;
@尺寸(最小值=2,最大值=32)
受保护的字符串lastName;
@NotNull@pass@DateTimeFormat(pattern=“dd/MM/yyyy”)
受保护的出生日期;
@NotNull@Email
受保护的字符串电子邮件;
保护串电话;
//接球手和接球手
}
/*控制器示例*/
@RestController
公共类用户控制器{
@后映射(“/users/register”)
公共响应属性姿势(@Valid@RequestBody用户,BindingResult){
if(result.hasErrors()){
返回新的响应属性(result.getAllErrors(),HttpStatus.INTERNAL_SERVER_ERROR);
}
返回新的响应属性(用户,HttpStatus.CREATED);
}
}
/*自定义验证器(甚至不必使用)*/
@组件//注释掉@Component annotation再次启用JSR-303
公共类SomeValidator实现验证器{
@凌驾
公共布尔支持(类clazz){
//只是一个例子
返回false;
}
@凌驾
公共无效验证(对象目标、错误){
//空的
}
}
我对这个问题摸不着头脑,不明白为什么我的JSR-303对象没有得到验证,但我设法缩小了范围,并用包含上述类的Spring Boot项目复制了它。 为什么呢?我是错过了什么,还是这是一个春天的错误


编辑

因此,代码中存在许多问题。首先,您的自定义验证器不支持任何东西,因此永远不会调用它。你可能意识到了这一点,所以我会让你来解决它

然而,您真正的问题是,通过创建这样的验证器bean,Spring不会创建
defaultValidator
bean(它是
LocalValidatoryBean
),也不会创建
methodValidationPostProcessor
bean(验证方法参数所需的)。这是人们在使用Spring时遇到的一个常见问题:一旦您做了一些干扰自动配置过程的事情,就必须手动定义。解决方案很简单:创建一个定义这些bean的配置类。例如:

@Configuration
public class ValidationConfig {
    @Bean public LocalValidatorFactoryBean defaultValidator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean public MethodValidationPostProcessor methodValidationPostProcessor() {
        return new MethodValidationPostProcessor();
    }
}

我想你正在使用Hibernate验证器?你能把你的示例项目放到什么地方吗?我有一个带有Hibernate validator 5.4.1的Spring Boot 1.5.3项目,我无法复制这个问题。我甚至使用了
applicationContext.getBeansOfType
来验证
@Component
注释是否会导致创建Springbean。@ngreen Yes,Hibernate Validator。默认值由SpringBoot拉入,所以org.hibernate:hibernate验证程序:5.3.5.Final。我将演示项目上传到GitHub。请参阅更新的帖子。您的
SomeValidator
是Spring验证API的一部分,也许您必须配置Spring同时使用这两个验证API?请看一个例子,我通过定义自定义验证注释来解决这个问题,但我刚刚尝试了你的建议,它似乎工作得完美无缺。因此,实现验证器接口的Bean出现在上下文中这一事实使得Spring取消了验证器的整个自动配置?是的,似乎就是这样。您可以查看
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
的源代码,了解工作原理。我还没有时间分析它。