Получить пользовательские ошибки проверки в BindingResult - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь удалить повторяющийся код из моих Spring Controllers, в частности - устранение необходимости выполнять validator.validate (form, bindingResult) из начала многих моих функций.

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

Фрагмент класса формы лица с аннотированными атрибутами

public class Person {

   @Size(min=1, message="Name missing")
   private String name;
   @Size(min=1, message="Age missing")
   private String age;

   .... getters and setters etc.

Person Validator Class

@Component
public class PersonValidator implements Validator {

@Override
public boolean supports(Class<?> clazz) {
    return Person.class.isAssignableFrom(clazz);
} 

@Override
public void validate(Object target, Errors errors) {
        errors.reject("No sir!");
    }
}

В идеале, я хотел бы иметь возможность иметь все ошибки, содержащиеся в BindingResult, включая ошибки из класса валидатора.Поэтому, когда я использую аннотацию @Validated, мой BindingResult полностью заполняется всеми ошибками как простых аннотаций, так и пользовательского валидатора.

Желаемый результат

@RequestMapping(value="/save", method=RequestMethod.POST)

public @ResponseBody String save(@Validated @RequestBody Person personForm, BindingResult bindingResult, HttpServletRequest request) 
{

    bindingResult.getAllErrors(); <-- fully pop with annotation and custom validator errors

Вместо:

@RequestMapping(value="/save", method=RequestMethod.POST)

public @ResponseBody String save(@Validated @RequestBody Person personForm, BindingResult bindingResult, HttpServletRequest request) 
{

    personValidator.validate(person, bindingResult) <-- Populate bindingResult with customer validator errors, if any

    bindingResult.getAllErrors(); 

У кого-нибудь есть какие-нибудь интересные примеры, которыми они могут поделиться, чтобы обойти это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Для работы нескольких валидаторов необходимо добавить валидатор в базу данных. В своем коде добавьте метод @InitBinder и добавьте PersonValidator к WebDataBinder.

@InitBinder("personForm")
public void initBinder(WebDataBinder wdb) {
  wdb.addValidators(personValidator);
}

Свяжет валидатор с объектом модели personForm.

Это настроит глобальное правило, согласно которому этот валидатор применяется ко всем привязкам / преобразованиям. Если вы хотите ограничить это определенной моделью, вы можете указать название модели в @InitBinder.

@InitBinder
public void initBinder(WebDataBinder wdb) {
  wdb.addValidators(personValidator);
}
0 голосов
/ 25 марта 2019

Как возможное решение, вы можете определить свою собственную пользовательскую аннотацию и CustomConstraintValidator , который будет реализовывать интерфейс ConstraintValidator<A extends Annotation, T>. В конце BindingResult будет содержать либо валидатор по умолчанию, либо ваши собственные ошибки валидатора.
Здесь является хорошим примером.Если я правильно понимаю ваш вопрос, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...