Весенняя аннотация javax.validation не перехвачена в BindingResult - PullRequest
1 голос
/ 25 апреля 2011

Я пытаюсь добавить валидацию к моим объектам модели (которые удваиваются как компоненты, поддерживающие форму) с использованием аннотаций 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();
}

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

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

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

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

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

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

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 апреля 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 поддерживается. Так что не уверен, что происходит. Думаю, я все ближе.

0 голосов
/ 26 апреля 2011

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

private BigDecimal myField;

до

private BigDecimal myFeild = BigDecimal.Zero;

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

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

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

0 голосов
/ 25 апреля 2011

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

...