Javax注解约束@ReportAsSingleViolation

nan*_*imi 1 java hibernate-validator bean-validation spring-validator

我使用 Spring 框架和 bean 验证规范(hibernate 实现)。考虑下面的代码片段,我使用以下方法进行了观察@ReportAsSingleViolation

  • @ReportAsSingleViolation添加时仅返回默认消息。我的期望是触发失败的消息而不是默认消息。

  • 当我删除@ReportAsSingleViolation注释时,一切都会按预期进行。与违反的约束相对应的所有错误消息都会正确返回。

此行为描述了 Bean 验证规范的一部分还是一个实现问题?

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
//@ReportAsSingleViolation
@NotBlank(message = "The input cannot be blank")
@Pattern(regexp = "[0-9A-Z_]+", message = "The input must content only uppercase, numbers and undescore")
@Size(max = 30, message = "The input must be maximal 30")
@Documented
public @interface MyAnnotation{

    String message() default "{com.example.MyAnnotation.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*met 5

这正是其目的@ReportAsSingleViolation:组合约束并将它们作为具有统一消息的单个约束进行报告。

这确实是规范定义的行为。

引用规范:

可以确保编写注释不会引发单独的错误报告。在这种情况下,如果一个或多个组合注释无效,则主约束将自动被视为无效并生成相应的错误报告。要将约束标记为在组合约束或组合约束之一失败时引发单个约束错误报告,请使用 @ReportAsSingleViolation 注释。

如果您只需要一个违规及其特定的错误消息,您可以使用 Hibernate Validator 特定的快速失败模式,但请注意,它不会为每个属性返回一个违规,而只会返回您的 bean 的第一个失败。

有关快速失败模式的更多详细信息,请参阅https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-fail-fast 。