我正在开发一个使用约束组合具有很大价值的应用程序。
例如,而不是:
@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消息,该消息并未向用户提供足够的信息。
感谢您的帮助。
答案 0 :(得分:1)
只需删除 @ReportAsSingleViolation 即可。这将为每个失败的约束提供 ConstraintViolation 。实际上,这也确保了所有约束都得到验证。使用 @ReportAsSingleViolation 验证会在第一个验证错误时停止,在您的案例中从主注释( ValidInvoiceNumber )返回消息。另请参阅相关Bean验证规范部分 - http://beanvalidation.org/1.1/spec/#constraintsdefinitionimplementation-constraintcomposition