Ограничение аннотации 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/ для получения дополнительной информации о быстром отказоустойчивом режиме.

Другие вопросы по тегам