Spring MVC + валидатор Hibernate + скорость

Кажется, я не могу получить базовую проверку, работающую с Spring MVC.

У меня есть следующий POJO:

public class Example {

    @NotNull(message="You must enter a value")
    @Size(min=2, max="2", message="You must enter 2 characters")
    private String value;

    public String getValue() { return value; }
    public void setValue(String value) { this.value = value; }

}

Мой самый простой контроллер выглядит так:

@Controller
@RequestMapping("/value.vm")
public class ValueController {

    @Autowired
    private Validator validator;

    @RequestMapping()
    public ModelAndView display(@Valid @ModelAttribute("example") Example e, BindingResult result) {
        //Details omitted
    }

Мой шаблон скорости так же прост:

<form target="_self" enctype="application/x-www-form-urlencoded" action="/value.vm" method="post">
    #springBind("example")
    #springFormInput("example.value", "")
    #springShowErrors("<br />", "")
</form>

Мой файл servlet.xml включает:

<mvc:annotation-driven />

Если я вручную проверяю отправку пустой формы (например, validator.validate(e)), я вижу, что мои сообщения об ошибках генерируются, однако они никогда не существуют в моем BindingResult.

Любые идеи, почему мой результат привязки не получает этих ошибок?


person Scott    schedule 09.03.2011    source источник


Ответы (2)


Я ошибочно использовал:

javax.validation.Validator 

Когда мне нужно было использовать

org.springframework.validation.Validator

Переход на эту версию и изменение кода проверки на:

validator.validate(e, result);

решил мою проблему.

person Scott    schedule 10.03.2011
comment
Если вы хотите использовать javax.validation.Validator и проверку JSR-303, поместите реализацию в свой путь к классам, например hibernate-validator. - person GaryF; 10.03.2011
comment
@GaryF У меня есть hibernate-validator в моем пути к классам, и это то, что я использовал. Однако ошибки проверки не помещались обратно в объект BindingResult, и последующие #springShowErrors не отображали ничего неправильного при вводе пустой формы. Мне не хватает какой-то другой части конфигурации? Как только я изменил реализацию проверки, Spring правильно отображает ошибки в разметке. - person Scott; 10.03.2011
comment
Ваш конфиг меня устраивает. Я не знаком с тем, как работают теги шаблона скорости, но сторона Spring выглядит хорошо. - person GaryF; 10.03.2011
comment
@GaryF Спасибо за подтверждение. Судя по тому, что я видел (глава о валидации слишком тонкая), это было правильно. По сути, этот тег скорости действует как тег ‹form:errors›, при этом последним связанным элементом является поле в объекте команды, которому будут соответствовать ошибки. Я не пробовал это вне скорости, чтобы точно знать, нужно ли вам использовать реализацию Spring @Validator, но я склоняюсь к тому, чтобы это сделать. - person Scott; 10.03.2011
comment
Вам определенно не нужно использовать Spring @Validator. Я делал это много раз с валидаторами JSR-303. - person GaryF; 11.03.2011

Вы по-прежнему можете использовать аннотацию JSR 303 @Valid для автоматического вызова проверки с помощью javax.validation.Validator, не вызывая ее вручную.

Это включено по умолчанию весной, если вы включаете элемент <mvc:annotation-driven/> в контекст своего приложения или @EnableWebMvc при использовании конфигурации Java.

Чтобы это работало, вам необходимо иметь реализацию для Bean Validation API, например, Hibernate Validator.

person ekem chitsiga    schedule 10.03.2016