Почему мой валидатор Spring 3 проверяет все на модели? - PullRequest
31 голосов
/ 17 января 2011

У меня есть контроллер Spring 3 с валидатором для одного из методов.Он настаивает на проверке каждого объекта в модели.Может ли кто-нибудь объяснить мне, почему это происходит, или я делаю что-то не так?

Согласно документации, 5.7.4.3 Настройка JSR-303 Validator для использования Spring MVC (http://static.springsource.org/spring/docs/3.0.0.RC3/spring-framework-reference/html/ch05s07.html)

В JSR-303 один экземпляр javax.validation.Validator обычно проверяет все объекты модели, которые объявляют ограничения проверки.Для настройки средства проверки на основе JSR-303 с Spring MVC просто добавьте JSR-Поставщик 303, такой как Hibernate Validator, к вашему пути к классам. Spring MVC обнаружит его и автоматически включит поддержку JSR-303 для всех контроллеров.

Пример:

@Controller
public class WhaleController {

        @Autowired
        private Validator myValidator;

        @Autowired
        private WhaleService whaleService;

        @InitBinder
        protected void initBinder(WebDataBinder binder) {
                binder.setValidator(this.myValidator);
        }

        @RequestMapping(value="/save-the-whales")
        @Transactional
        public void saveTheWhales(@Valid WhaleFormData formData, BindingResult errors, Model model) {
                if (!errors.hasFieldErrors()) {
                        Whale whale = new Whale();

                        whale.setBreed( formData.getBreed() );

                        this.whaleService.saveWhale( whale );

                        model.addAttribute("whale", whale);

                }
                model.addAttribute("errors", errors.getFieldErrors());
        }

}

При запускеон будет жаловаться, что Whale является недопустимой целью для myValidator (который настроен для проверки WhaleFormData, и делает это нормально). Whale - это POJO без ограничений проверки, аннотаций и нигде в конфигурации.объект, помещенный в модель, попытается пройти валидацию и потерпит неудачу, если валидатор не настроен на его обработку.все в порядке.

Может кто-нибудь сказать мне, почему это так, указать мне на соответствующую документацию и / или сказать мне лучший способ поставить что-то на модель без проверки?

ВВ приведенном выше случае я хотел бы поместить «кит» в модель, поскольку теперь он будет иметь уникальный whaleId (), полученный от моего слоя постоянства.

Спасибо!

1 Ответ

53 голосов
/ 17 января 2011

Полагаю, это поведение не очень хорошо описано в документации.

Проблема вызвана следующим:

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

  2. DataBinder.setValidator() содержит защитную проверку, которая вызывает Validator.supports() и выдает исключение, если возвращается false. Таким образом, нет попытки выполнить проверку, просто предварительная проверка.

Решение состоит в том, чтобы ограничить область действия @InitBinder определенным атрибутом:

@InitBinder("whaleFormData")
protected void initBinder(WebDataBinder binder) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...