当前位置: 首页 > 知识库问答 >
问题:

使用Spring的JSR-303 bean验证没有生效

郭弘盛
2023-03-14

我按照文档(http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/validation.html)中给出的内容配置了JSR-303自定义验证器,在类路径上使用LocalValidatorFactoryBean和Hibernate验证器完成。但是,我的验证器只是拒绝启动。我在这里(https://github.com/abhijitsarkar/java/tree/master/spring-jsr-303)放置了一个非常简单的测试项目,以及一个失败的单元测试。如果您决定看一看,只需克隆它并从根目录运行gradlew清洁测试。我使用的是Spring框架4.0.2。RELEASE和Hibernate验证器5.0.3。最终。

验证中的方法:

public Coffee serve(@ValidOrder(Coffee.Blend.class) final String blend) {

ValidOrder注释:

@Documented
@Constraint(validatedBy = {OrderValidator.class})
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,
        ElementType.FIELD,
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.PARAMETER})
@NotNull
public @interface ValidOrder {

OrderValidator验证程序:

public class OrderValidator implements ConstraintValidator<ValidOrder, String> {

Spring配置:

@Configuration
@ComponentScan(basePackages = "name.abhijitsarkar.coffeehouse")
@EnableAspectJAutoProxy
public abstract class AppConfig {

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }
}

依赖关系:

dependencies {
    compile(
            [group: 'javax.inject', name: 'javax.inject', version: injectApiVersion],
            [group: 'javax.validation', name: 'validation-api', version: beanValidationApiVersion],
            [group: 'javax.annotation', name: 'javax.annotation-api', version: annotationApiVersion],
            [group: 'org.springframework', name: 'spring-beans', version: springVersion],
            [group: 'org.springframework', name: 'spring-context', version: springVersion],
            [group: 'org.springframework', name: 'spring-aop', version: springVersion],
            [group: 'org.aspectj', name: 'aspectjrt', version: aspectjVersion]
    )
    runtime(
            [group: 'org.hibernate', name: 'hibernate-validator', version: hibernateValidatorVersion],
            [group: 'javax.el', name: 'javax.el-api', version: elVersion],
            [group: 'org.glassfish.web', name: 'javax.el', version: glassfishElVersion],
            [group: 'org.aspectj', name: 'aspectjweaver', version: aspectjVersion]
    )

共有2个答案

万俟亦
2023-03-14

对于Spring to验证,要启动混合参数,它前面需要一个@Valid注释。

您的方法可能不起作用,因为JSR303不支持参数约束。

约束注释可以针对以下任何元素类型:

约束属性字段

约束吸气剂的方法

受约束bean的类型

构成其他约束的约束的ANNOTATION\u类型

http://beanvalidation.org/1.0/spec/#constraintsdefinitionimplementation

勾渝
2023-03-14

>

  • 除了LocalValidatorFactoryBean之外,还需要配置MethodValidationPostProcessor
  • 要验证的类必须具有已验证的注释,否则不会在方法中搜索内联约束注释。

    @Configuration
    @ComponentScan(basePackageClasses = {SpringPackageComponentScanMarker.class})
    @EnableAspectJAutoProxy
    public abstract class AppConfig {
    
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        final MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
    
        return methodValidationPostProcessor;
    }
    
    @Bean
    public LocalValidatorFactoryBean validator() {
        final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    
        return localValidatorFactoryBean;
      }
    }
    

    ...

    @Service
    @Validated
    public class SpringBarista extends Barista {
    

    参考手册中关于与JSR-303集成的部分方便地省略了这两个关键点,否则BV无法启动。这只是导致我进行了6个小时的调试和头发撕裂,我做了文档所说的一切,但BV根本无法启动。我最终不得不通过Spring源代码进行调试才能理解这一点。一定有更简单的方法,我不能是唯一一个有这个问题的人。为他们创建了一个JIRA SPR-11473来更新文档。

  •  类似资料:
    • 我提出了一个使用JSR303组进行条件验证的概念。“有条件地”意味着我有一些字段,这些字段只有在另一个字段具有特定值时才相关。 示例:有一个选项可以选择是以个人身份注册还是以公司身份注册。选择公司时,用户必须填写包含公司名称的字段。 但是Spring由于数据绑定而打破了这个想法。在验证开始之前,Spring将数据绑定到RegisterForm。例如,如果类型不兼容(应为int值,但用户用字母填充表

    • 在添加Spring特定的配置之前,没有进行任何验证,但也没有任何错误。可能根本没有尝试验证。 现在我已经添加了必要的@Validated类注释和bean定义: 我得到以下错误:

    • 我使用Spring 3.2.2与Primeface 4.0和Hibernate 4.2。我在我的实体上有JSR303验证注释,并且我配置了Spring来在服务层验证它们——这很好。 但是我希望在调用服务之前启动JSF验证,但事实并非如此。我所做的所有研究都表明,我只需在类路径中添加一个验证程序,JSF2就会自动应用。 我已将建议的JAR添加到我的类路径中: 完整的依赖关系树可以在https://g

    • 我目前正在用Spring开发一个应用程序,使用Hibernate作为ORM。我知道,默认情况下,Hibernate在持久化或加载实体时都会使用JSR-303 Bean验证。由于此应用程序支持草稿(我希望在持久化后执行验证),因此必须将其添加到persistence.xml中: 模型实体代码: 我想知道如何传播bean验证,以便每当MyEntity实例被验证时,所有相关联的bar也被验证,而不必在验

    • 我正在使用Spring Boot 1.5.2。RELEASE和不能合并JSR-349(bean验证1.1)的 对于POST请求,如果方法参数是Java POJO,那么用注释该参数可以正常工作,但注释 我有带注释的控制器类与Spring的 关于这个问题有很多问题,我已经评论过这个答案,它对我不起作用。 Spring Boot包括-。 我错过什么了吗? 示例代码, 当我为

    • 这是用Kotlin编写的User类: 这就是测试: 无效的角色映射为NULL。 这里有一个示例项目,以防您想尝试一些东西。