Bean 验证:重复注释异常

aku*_*ma8 4 spring-mvc hibernate-validator bean-validation spring-boot

我定义了这个约束:

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

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

\n\n
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]).+)\n    at sun.reflect.annotation.TypeAnnotationParser.mapTypeAnnotations(Unknown Source) ~[na:1.8.0_162]\n    at sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl.<init>(Unknown Source) ~[na:1.8.0_162]\n    at sun.reflect.annotation.AnnotatedTypeFactory.buildAnnotatedType(Unknown Source) ~[na:1.8.0_162]\n    at sun.reflect.annotation.TypeAnnotationParser.buildAnnotatedType(Unknown Source) ~[na:1.8.0_162]\n    at java.lang.reflect.Field.getAnnotatedType(Unknown Source) ~[na:1.8.0_162]\n    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findCascadingMetaData(AnnotationMetaDataProvider.java:614) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.findPropertyMetaData(AnnotationMetaDataProvider.java:236) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getFieldMetaData(AnnotationMetaDataProvider.java:225) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.retrieveBeanConfiguration(AnnotationMetaDataProvider.java:133) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.provider.AnnotationMetaDataProvider.getBeanConfiguration(AnnotationMetaDataProvider.java:124) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.getBeanConfigurationForHierarchy(BeanMetaDataManager.java:220) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.createBeanMetaData(BeanMetaDataManager.java:187) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at org.hibernate.validator.internal.metadata.BeanMetaDataManager.lambda$getBeanMetaData$0(BeanMetaDataManager.java:160) ~[hibernate-validator-6.0.7.Final.jar:6.0.7.Final]\n    at java.util.concurrent.ConcurrentMap.computeIfAbsent(Unknown Source) ~[na:1.8.0_162]\n
Run Code Online (Sandbox Code Playgroud)\n\n

出了什么问题?

\n

Gui*_*met 6

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

\n

使用 javac 编译(例如,如果您执行 mvn clean install)可以正常工作。

\n

您唯一的解决方法是升级到 Hibernate Validator 6+,其中所有约束注释都标记为可重复。

\n

然后你可以这样做:

\n
@Size( min = 5 )\n@NotBlank\n@Pattern( regexp = "(?=.*[0-9]).+", message = "au moins un chiffre" ),\n@Pattern( regexp = "(?=.*[a-z]).+", message = "au moins une lettre miniscule" ),\n@Pattern( regexp = "(?=.*[A-Z]).+", message = "au moins une lettre majiscule" ),\n@Pattern( regexp = "(?=.*[!@#$%^&*+=?-_()/\\"\\\\.,<>~`;:]).+", message = "au moins un caract\xc3\xa8re sp\xc3\xa9cial" ),\n@Pattern( regexp = "(?=\\\\S+$).+", message = "pas d\'espace" )\nprivate String    password;\n
Run Code Online (Sandbox Code Playgroud)\n

没有 List 构造。

\n

在这种情况下,编译器按预期工作(至少对于 Oxygen.3 而言)。

\n

我将在 Eclipse 中打开一个错误,看看他们是否可以对此采取措施。

\n

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

\n