2013-07-03 1 views
2

У меня есть фасоль с аннотациями проверки. Я собираюсь запустить проверку вручную, используя следующий код:Сообщения о проверке бобов из программы

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, validationGroup); 

Мой вопрос: 1.) как вы получите поле, которое не прошло проверку и 2.) Как получить связанный сообщение?

Я не хочу использовать файл .properties. Для отображения интерфейса нет интерфейса. Но его служба, и мне нужно отправить ответ с сообщением об ошибке и полем, которые не прошли проверку.

ответ

4

Как вы получите поле, которое не удалось проверить?

Неверное подтверждение будет возвращено в MethodConstraintViolationException. Вы получаете отдельные нарушения, вызывая getConstraintViolations(), а затем поле может быть получено getPropertyPath() и ходьбе по узлам.

Однако, если у вас есть случай, когда имя поля, возвращаемое в ответе, не совпадает с именем свойства в bean-компоненте, например, если вы возвращаете ответы на вопрос о змеи (то есть user_name), но имя свойства bean username, вам нужно сделать немного более творческим.

В этом сценарии вы можете сохранить имя поля как Payload в аннотации проверки компонента.

поле Ответ:

@JsonProperty("user_name") 
@NotEmpty(message = ErrorMessageKeys.USERNAME_REQUIRED, 
      payload = {FieldNamePayload.UserName.class}) 
private String username; 

Payload Класс:

public class FieldNamePayload 
{ 
    /** 
    * Represents the field name "user_name" 
    */ 
    public static class UserName implements ValuePayload 
    { 
     private static final String value = "user_name"; 

     @Override 
     public String getValue() 
     { 
      return value; 
     } 
    } 
} 

Получение Payload в вашем Exception Mapper:

List<MethodConstraintViolation<?>> violations = new ArrayList<MethodConstraintViolation<?>>(exception.getConstraintViolations()); 

    for(MethodConstraintViolation<?> violation : violations) 
    { 
     String field = getFieldName(violation); 
     String message = violation.getMessage(); 

     for(Class<? extends Payload> payload : new ArrayList<Class<? extends Payload>>(violation.getConstraintDescriptor().getPayload())) 
     { 
      //Retrieve field name from constraint payload 
      if(payload.isAssignableFrom(FieldNamePayload.UserName.class)) 
      { 
       field = getPayloadValue(payload); 
      } 
     } 

     //Create an error response here! 
    } 

Как вы можете получить связанное сообщение?

По умолчанию рамка проверки боба смотрит сообщения в локализованных файлах в корневом каталоге с путем класса следующего соглашения об именах:

  • ValidationMessages.properties для локал по умолчанию.
  • ValidationMessages_{locale}.properties при локализации требуется

Если вы хотите, чтобы переопределить это поведение и изменить, где сообщение проверки в настоящее время извлекается из вы можете использовать поставщик проверки Hibernate и реализовать пользовательские ResourceBundleLocator, которые вы бы добавить к ResourceBundleMessageInterpolator.

ValidatorFactory validatorFactory = Validation 
    .byProvider(HibernateValidator.class) 
    .configure() 
    .messageInterpolator(
     new ResourceBundleMessageInterpolator(
      new MyCustomResourceBundleLocator())) 
    .buildValidatorFactory(); 
+0

Если я не хочу переопределять сообщения, и я просто хочу получить сообщение о проверке по умолчанию? –

+1

Сообщения по умолчанию находятся в объекте MessageConstraintViolation. Вызвать метод getMessage(). Взгляните на приведенный выше код карты исключений. – gregwhitaker

+0

Большое спасибо за разъяснение! –

1

Относительно 1, что вы имеете в виду с полем? Java.lang.reflect.Field? Вы не получаете доступ к нему напрямую. Что вы можете сделать, так это вызвать ConstraintViolation # getPropertyPath, чтобы получить путь к свойствам. Вам нужно итерации узлов и на листовом узле вы можете вызвать, например getName(), чтобы получить имя свойства и getKind(), чтобы определить тип узла.

Что касается 2, ConstraintViolation # GetMessage() дает интерполированное сообщение об ошибке

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

+0

1.) Полевые средства, bean variable/property. Не «Поле». Если я задал @NotNull, и если эта переменная не сработала с этим ограничением, мне нужно иметь возможность получить сообщение. 2.) Googling об ошибках возвратил мне образцы с использованием файлов свойств для сообщений об ошибках проверки Bean. Однако я не намерен его использовать. –