Javax注释约束@ReportAsSingleViolation [关闭]

问题描述 投票:-1回答:1

我使用Spring Framework和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 { };
}
java bean-validation hibernate-validator spring-validator
1个回答
2
投票

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

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

引用规范:

可以确保撰写注释不会引发单个错误报告。在此方案中,如果一个或多个组成注释无效,则主约束将自动视为无效,并生成相应的错误报告。要将约束标记为引发单个约束错误报告(如果组合约束或其中一个组合约束失败),请使用@ReportAsSingleViolation批注。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.