2016-12-02 5 views
2

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

Моя проблема заключается в том, что я затрудняюсь найти простой способ «переключиться» на основе типа нарушения ограничений, и из-за этого у меня возникают проблемы с написанием пользовательских сообщений. В идеале, я мог бы использовать переключатель на основе аннотации и возвращать пользовательские сообщения в ответ. В идеале это выглядело бы примерно так:

@Override 
public Response toResponse(ConstraintViolationException exception) { 

    ConstraintViolation violation = exception.getConstraintViolations().iterator().next(); 

    String message = null; 
    switch (violation.getType()) { 
     case SomeEnum.NOT_NULL: 
      message = "It's not null!"; 
      break; 
     default: 
      message = "Other message!"; 
    } 

    ... 
} 

Возможно ли это как-то просто?

+0

Это не очень хороший подход - что делать, если вы хотите интернационализировать сообщения? Если вы идете по этой дороге, сделайте аннотированное «сообщение» ключевым и используйте обычные пакеты сообщений. См. Значения по умолчанию в готовых аннотациях ограничений. – chrylis

+0

У меня уже есть файл строк для работы с интернационализацией. Я упростил этот пример, чтобы не быть в центре внимания. Мне интересен механизм выбора правильного обмена сообщениями, а не где их извлекать. – Brandon

ответ

1

ConstraintViolation#getConstraintDescriptor() должен быть вам полезен. Помимо всего прочего, возвращаемый дескриптор выставляет нарушенный тип ограничения аннотаций:

if (violation.getConstraintDescriptor().getAnnotation().annotationType() == NotNull.class) { ... } 

Это, как говорится, проблема может быть лучше решать путем реализации пользовательских MessageInterpolator, который даст вам ожидаемое сообщение в пределах нарушения ограничения сразу ,