【问题标题】:Javax annotation constrainst @ReportAsSingleViolation [closed]Javax注释约束@ReportAsSingleViolation [关闭]
【发布时间】:2018-09-12 16:07:09
【问题描述】:

我使用 Spring 框架和 bean 验证规范(休眠实现)。考虑到下面的代码 sn-p,我使用@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】:

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

    确实是规范定义的行为。

    引用规范:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多