【问题标题】:Bean validation : Duplicate annotation ExceptionBean 验证:重复注释异常
【发布时间】:2018-04-03 22:56:15
【问题描述】:

我已经定义了这个约束:

@Size( min = 5 )
@NotBlank
@Pattern.List( {
        @Pattern( regexp = "(?=.*[0-9]).+", message = "au moins un chiffre" ),
        @Pattern( regexp = "(?=.*[a-z]).+", message = "au moins une lettre miniscule" ),
        @Pattern( regexp = "(?=.*[A-Z]).+", message = "au moins une lettre majiscule" ),
        @Pattern( regexp = "(?=.*[!@#$%^&*+=?-_()/\"\\.,<>~`;:]).+", message = "au moins un caractère spécial" ),
        @Pattern( regexp = "(?=\\S+$).+", message = "pas d'espace" )
} )
private String    password;

但是当我发送不遵守此约束的无效密码时,出现以下异常:

java.lang.annotation.AnnotationFormatError: Duplicate annotation for class: interface javax.validation.constraints.Pattern: @javax.validation.constraints.Pattern(flags=[], groups=[], message=au moins une lettre miniscule, payload=[], regexp=(?=.*[a-z]).+)
    at sun.reflect.annotation.TypeAnnotationParser.mapTypeAnnotations(Unknown Source) ~[na:1.8.0_162]
    at sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl.<init>(Unknown Source) ~[na:1.8.0_162]
    at sun.reflect.annotation.AnnotatedTypeFactory.buildAnnotatedType(Unknown Source) ~[na:1.8.0_162]
    at sun.reflect.annotation.TypeAnnotationParser.buildAnnotatedType(Unknown Source) ~[na:1.8.0_162]
    at java.lang.reflect.Field.getAnnotatedType(Unknown Source) ~[na:1.8.0_162]
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findCascadingMetaData(AnnotationMetaDataProvider.java:614) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findPropertyMetaData(AnnotationMetaDataProvider.java:236) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getFieldMetaData(AnnotationMetaDataProvider.java:225) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:133) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:124) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanConfigurationForHierarchy(BeanMetaDataManager.java:220) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.createBeanMetaData(BeanMetaDataManager.java:187) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.lambda$getBeanMetaData$0(BeanMetaDataManager.java:160) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]
    at java.util.concurrent.ConcurrentMap.computeIfAbsent(Unknown Source) ~[na:1.8.0_162]

出了什么问题?

【问题讨论】:

    标签: spring-mvc spring-boot bean-validation hibernate-validator


    【解决方案1】:

    哼。所以这是一个 Eclipse 编译器错误(您可能会在使用 Eclipse 编译器的另一个 IDE 中遇到它)。

    使用 javac 编译(例如,如果您执行 mvn clean install)没有任何问题。

    您唯一的解决方法是升级到 Hibernate Validator 6.0.x(6.0.9.Final 是最新的),其中所有约束注释都标记为可重复。

    你可以这样做:

    @Size( min = 5 )
    @NotBlank
    @Pattern( regexp = "(?=.*[0-9]).+", message = "au moins un chiffre" ),
    @Pattern( regexp = "(?=.*[a-z]).+", message = "au moins une lettre miniscule" ),
    @Pattern( regexp = "(?=.*[A-Z]).+", message = "au moins une lettre majiscule" ),
    @Pattern( regexp = "(?=.*[!@#$%^&*+=?-_()/\"\\.,<>~`;:]).+", message = "au moins un caractère spécial" ),
    @Pattern( regexp = "(?=\\S+$).+", message = "pas d'espace" )
    private String    password;
    

    没有 List 结构。

    在这种情况下,编译器按预期工作(至少使用 Oxygen.3)。

    我会在 Eclipse 上打开一个 bug,看看他们能不能做点什么。

    更新:Eclipse 问题:https://bugs.eclipse.org/bugs/show_bug.cgi?id=533199

    【讨论】:

    • 是的,我并不感到惊讶,因为在 Hibernate Validator 6.0.x 的开发过程中,我们在 javac 和 Eclipse 编译器中出现了很多带有注释的编译器错误。希望它会在某个时候得到修复,因为当你遇到它时它会很烦人。在这种情况下,您有一个简单的解决方法,但不幸的是,情况并非总是如此......
    • 快速更新:Eclipse 问题得到确认:bugs.eclipse.org/bugs/show_bug.cgi?id=533199#c1.
    • 感谢您报告问题。我使用 Spring Tool Suite,因为它基于 Eclipse,所以问题被传播了。幸运的是你的回答帮助了......
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多