将约束组合中的默认hibernate消息委派给失败的验证

时间:2014-03-21 18:20:00

标签: java bean-validation hibernate-validator

我正在开发一个使用约束组合具有很大价值的应用程序。

例如,而不是:

@Size(min=1, max=60)
@Pattern(regexp = "[a-zA-Z0-9]*")
protected String invoiceNumber;

我可以写:

@ValidInvoiceNumber
protected String invoiceNumber;

使用以下注释:

@Size(min=1, max=60)
@Pattern(regexp = "[a-zA-Z0-9]*")
@ReportAsSingleViolation
@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface ValidInvoiceNumber {
    String message() default "{someMessageCode}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

我面临的问题是我希望从验证返回的约束违规消息不是某些通用的@ValidInvoiceNumber消息(如上面的someMessageCode),而是要成为失败的实际注释的消息。因此,例如,如果大小检查失败,我将返回大小错误默认消息。如果Pattern消息失败,我将收到Pattern错误默认消息。

目前我只是收到一般的@ValidInvoiceNumber消息,该消息并未向用户提供足够的信息。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

只需删除 @ReportAsSingleViolation 即可。这将为每个失败的约束提供 ConstraintViolation 。实际上,这也确保了所有约束都得到验证。使用 @ReportAsSingleViolation 验证会在第一个验证错误时停止,在您的案例中从主注释( ValidInvoiceNumber )返回消息。另请参阅相关Bean验证规范部分 - http://beanvalidation.org/1.1/spec/#constraintsdefinitionimplementation-constraintcomposition