Сообщения о проверке бина из программы

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

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

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

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

2 ответа

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

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

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

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

Поле ответа:

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

Класс полезной нагрузки:

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

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

Получение полезной нагрузки в вашем Map Exception:

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!
 }
</class<?></methodconstraintviolation<?></methodconstraintviolation<?>

<span>Как вы получаете связанное сообщение?</span>

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

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

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

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


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

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

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

licensed under cc by-sa 3.0 with attribution.