Spring аннотация javax.validation не попала в BindingResult

Я пытаюсь добавить проверку к своим объектам модели (которые удваиваются как мои компоненты поддержки формы), используя аннотации javax.validation.

Моя модель выглядит так:

public Class TestObject {
    private String myProp;
    private InnerObject innerObject;

    //getters and setters omitted
}

public Class InnerObject {
  private BigDecimal myValue;

  @NotNull
  public BigDecimal getMyValue();
}

В моем контроллере у меня есть вызов метода следующим образом:

public View calculate(@ModelAttribute("testObject") @Valid TestObject testObject, BindingResult result)

У меня также есть <mvc:annotation-driven/> в моем файле spring-servlet.xml.

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

Я использую Java 1.6 с Hibernate-Validator-4.2.0 и Validation-API-1.0.0 в своем пути к классам.

Может ли кто-нибудь помочь мне и сообщить мне, что я делаю неправильно? Играл с этим какое-то время и не мог заставить его работать.

Спасибо


person blong824    schedule 25.04.2011    source источник


Ответы (3)


Вы не ссылаетесь на свой класс InnerObject. Ваш контроллер принимает TestObject, но поле "innerObject" класса TestObject имеет тип String.

person digitaljoel    schedule 25.04.2011
comment
Извините, в примере опечатка. Я буду редактировать, чтобы изменить. Та же проблема. - person blong824; 25.04.2011
comment
Итак, что произойдет, если вы добавите проверенное поле в TestObject вместо того, чтобы иметь его в содержащемся объекте, будет ли оно проверено? Что-то вроде строки с минимальной/максимальной длиной должно быть легко протестировано. - person digitaljoel; 25.04.2011
comment
Спасибо за предложение. Пробовал это уже. Также не возвращает результат привязки. - person blong824; 25.04.2011
comment
Хм, тогда у меня закончились предложения. Хотя похоже на какую-то проблему с конфигурацией. - person digitaljoel; 25.04.2011
comment
Спасибо за попытку. Я буду продолжать и дам вам знать, если я решу это. - person blong824; 25.04.2011

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

binder.setValidator(new CustomValidator());

Поэтому я удалил его, а затем добавил @Valid над геттером моего внутреннего объекта, например:

@Valid
public InnerObject getInnerObject();

Теперь я вижу, что в моем коде есть ошибки связывания. Хотя у меня новая проблема. У меня есть @NotNull в свойстве BigDecimal, и я получаю следующую ошибку

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.UnexpectedTypeException: No validator could be found for type: java.math.BigDecimal

Из документации видно, что BigDecimal поддерживается. Так что не уверен, что происходит. Думаю, я приближаюсь, хотя.

person blong824    schedule 25.04.2011

Хорошо, чтобы устранить ошибку BigDecimal, которую я изменил:

private BigDecimal myField;

to

private BigDecimal myFeild = BigDecimal.Zero;

Теперь он работает правильно.

Единственным недостатком является то, что, поскольку это мои объекты поддержки формы, изначально в поле отображается ноль вместо пробела.

Я не уверен, есть ли способ обойти это?

person blong824    schedule 26.04.2011