Ограничение аннотации Javax @ReportAsSingleViolation
Я использую Spring Framework и спецификацию проверки bean-компонентов (реализацию hibernate). Учитывая приведенный ниже фрагмент кода, я сделал следующее наблюдение, используя @ReportAsSingleViolation
:
Только сообщение по умолчанию возвращается, когда
@ReportAsSingleViolation
добавлен. Я ожидаю, что у меня будет сообщение, которое вызовет сбой, а не по умолчанию.Когда я удаляю
@ReportAsSingleViolation
аннотация, все работает как положено. Все сообщения об ошибках, соответствующие нарушенным ограничениям, возвращаются правильно.
Это поведение описывает часть спецификации проверки Бина или это проблема реализации?
@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 ответ
Это именно цель @ReportAsSingleViolation
: составление ограничений и представление их как единого с унифицированным сообщением.
Это действительно поведение, определяемое спецификацией.
Цитирование спецификации:
Можно гарантировать, что составление аннотаций не вызовет отдельных отчетов об ошибках. В этом случае, если одна или несколько составных аннотаций являются недопустимыми, основное ограничение автоматически считается недействительным и создается соответствующий отчет об ошибке. Чтобы пометить ограничение как создание отдельного отчета об ошибке ограничения в случае сбоя составного или одного из составных ограничений, используйте аннотацию @ReportAsSingleViolation.
Если вам нужно только одно нарушение с его конкретным сообщением об ошибке, вы можете использовать специфичный для Hibernate Validator отказоустойчивый режим, но имейте в виду, что он не вернет одно нарушение для свойства, только первое сбои для вашего компонента.
См. https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/ для получения дополнительной информации о быстром отказоустойчивом режиме.