Уточнение сообщения об ошибке проверки javax - PullRequest
11 голосов
/ 08 марта 2011

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

Я искал, пытаясь найти способ получить сообщения об ошибках, предоставленные моей проверкой 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

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

Кли

Ответы [ 2 ]

13 голосов
/ 08 марта 2011

Хммм. Досадно! На мой взгляд, у вас есть 3 варианта:

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

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

  3. .. Но необходимая информация фактически содержится в объекте 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 
    }
  }
1 голос
/ 08 марта 2011

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

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

...