Более подробное сообщение об ошибке проверки javax

Извините, если раньше этот вопрос был рассмотрен. Если у меня есть ссылка на меня, я пока не нашел удовлетворительного ответа.

Я смотрю вокруг, пытаясь найти способ, чтобы сообщения об ошибках, предоставленные моей проверкой javax, были более конкретными.

Сообщение, которое у меня есть для моей аннотации @Min, указано в файле ValidationMessages.properties:

javax.validation.constraints.Min.message=The value of this variable must be less than {value}.

и это печатает, как и ожидалось

The value of this variable must be less than 1

Что бы я хотел, это сообщение также включает имя переменной (и класса), которая не прошла проверку, а также значение переменной, которая не удалась. Так что больше.

The value of class.variable was 0 but not must be less than 1

Любая помощь будет принята с благодарностью.

Кли

Ответ 1

Хммм. Досадно! Как я вижу, у вас есть 3 варианта:

  • Вы можете написать собственный MessageInterpolator и подставить его в свою конфигурацию проверки, но это кажется очень хрупким.

  • Вы можете объявить свою собственную аннотацию в стиле @Min (посмотреть, как сделать здесь специальный валидатор)...

  • . Но необходимая информация фактически хранится в объекте ConstraintViolation, который выходит из экземпляра Validator. Это просто, что он не попадает в сообщение по умолчанию.

Я предполагаю, что вы в настоящее время используете какую-то веб-инфраструктуру для проверки формы. Если это так, должно быть довольно просто переопределить проверку и сделать что-то вроде этого (быстрая хакерская версия, вы должны быть в состоянии сделать это очень аккуратно, используя внешний файл свойств):

  Set<ConstraintViolation<MyForm>> violations = validator.validate(form);
  for (ConstraintViolation<MyForm> cv : violations) {
    Class<?> annoClass = cv.getConstraintDescriptor().getAnnotation().getClass();
    if (Min.class.isAssignableFrom(annoClass)) {
      String errMsg = MessageFormat.format(
        "The value of {0}.{1} was: {2} but must not be less than {3}",
        cv.getRootBeanClass(),
        cv.getPropertyPath().toString(), 
        cv.getInvalidValue(),
        cv.getConstraintDescriptor().getAttributes().get("value"));
            // Put errMsg back into the form as an error 
    }
  }

Ответ 2

Я считаю, что вам нужно создать пользовательское ограничение.
Вы не указали, какую реализацию спецификации вы используете, но есть хорошая документация о том, как создать пользовательское ограничение для Hibernate Validator здесь,

Часть процесса будет включать создание собственного файла ValidationMessages.properties