Несоответствие типа Spring и обязательные поля

В контексте Spring Webflow 2.0.x ......

Я обрабатываю "несоответствия типов" привязки формы, то есть в результате попытки сопоставить строку с полем Integer, используя следующее в моем messages.properties

typeMismatch={0} contains invalid data.

Это прекрасно работает.

Проблема в том, что если поле, в котором произошла ошибка typeMismatch, было «обязательным», то я также получаю сообщение об ошибке для отсутствующего обязательного поля, что, как я полагаю, логично, поскольку отправленное значение никогда не было привязано. ("Обязательный" определяется в XML-файле проверки Commons)

Поэтому я не хочу видеть сообщение об ошибке «XXX is required field», когда поле отсутствует только из-за typeMismatch. Как мне решить эту проблему? Я думал о замене initBinder() в FormAction, но быстро ничего не добился ...


person Lawrence Tierney    schedule 02.09.2010    source источник
comment
Есть ли в этом прогресс? В настоящее время я борюсь с той же проблемой.   -  person joey_g216    schedule 16.02.2012
comment
Вы можете опубликовать небольшой пример проекта?   -  person Yves Martin    schedule 13.03.2012


Ответы (2)


Как упоминал Ив, среди трех подходов я использовал собственный метод проверки, и это очень просто. Вы можете использовать настраиваемый валидатор, который проверяет, есть ли в поле формы сообщение об ошибке XML. Если в поле нет ошибки, вы можете проверить правильность своей строки. Таким образом будет отображаться только один.

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

Например:

<field property="somefield" depends="required,mask" page="2">
<arg key="somelabel"/>
<var>
    <var-name>mask</var-name>
    <var-value>${somepattern}</var-value>
</var>
</field>
person Rohit    schedule 10.04.2012

У вас есть много вариантов в порядке предпочтения:

  • Выборочно установите сообщение typeMismatch.target. yourFieldName или typeMismatch.int в файлах ресурсов

  • Внедрите свой собственный валидатор, чтобы вы можете отправить специальное сообщение, если целочисленный синтаксический анализ завершится неудачно, до этапа привязки

  • Создайте BindingErrorProcessor для обработки различных проблем синтаксического анализа

person Yves Martin    schedule 13.03.2012
comment
Обычная конфигурация цепочки - это сначала валидатор, а затем привязка. Может твоя поменяли. - person Yves Martin; 13.03.2012
comment
Валидаторы использовали необходимый ресурс для своего сообщения - person Yves Martin; 13.03.2012
comment
Итак, у меня есть @Required поверх поля, и я получаю эту ошибку проверки typeMismatch. Как мне сделать, чтобы отображалось только сообщение об ошибке typeMismatch, а не требуемое сообщение об ошибке? - person mico; 13.03.2012
comment
Итак, у меня есть переменная в классе сохранения, где у меня есть аннотация @NotNull поверх Integer xy. Я даю строку, скажем foo, и пытаюсь сохранить. Я получаю две ошибки: одна связана с typeMismatch, а другая - с обязательным полем. Точно так же, как в основном вопросе. - person mico; 13.03.2012
comment
Вопрос касается аннотации @ Required для Commons Validator, а не @ NotNull для Hibernate ... - person Yves Martin; 13.03.2012