Javax注释限制了@ReportAsSingleViolation

时间:2018-09-12 16:07:09

标签: java bean-validation hibernate-validator spring-validator

我使用Spring框架和bean验证规范(休眠实现)。考虑下面的代码片段,我使用@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 { };
}

1 个答案:

答案 0 :(得分:2)

这正是@ReportAsSingleViolation的目的:编写约束并将其作为单个消息报告并带有统一消息。

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

引用规格:

  

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

如果您只希望一次违反特定错误信息的错误,则可以使用特定于Hibernate Validator的故障快速模式,但是请注意,它不会为每个属性返回一次违反,只是您的bean第一个失败。 / p>

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