Я использую Spring MVC 2.5 и для моего класса модели/компонента, на данный момент я использую проверку на стороне сервера. Одна из проверок, которую я хотел сделать, - проверить, не являются ли некоторые из входов числовыми (0-9). Пользователь может вводить нечисловые символы, такие как «abcd» вместо «1234».Исключение связывания свойства/поля Spring MVC
У меня есть @Pattern
, который принимает только положительный BigDecimal (он представляет собой сумму в долларах).
public class OfferSettingBean implements Serializable {
private static final String NUMBER_WITH_DECIMAL_PLACES_ONLY="^\\d+([.]\\d+)?$";
//org.hibernate.validator.pattern
@Pattern(regex = NUMBER_WITH_DECIMAL_PLACES_ONLY, message = "invalid.amount")
private BigDecimal offerSize;
//the rest of the code goes here including setter and getter methods
}
страница JSP
<input type="text" name="offerSize" id="offerSize" value="${offerSetting.offerSize}" placeholder="$" />
Проблема с моей кодой, если пользователь вводит номер нон характера как «asdfsd» оно не достигает даже до точки, где он должен проверить шаблон.
Failed to convert property value of type [java.lang.String] to required type [java.math.BigDecimal] for property offerSize; nested exception is java.lang.NumberFormatException
Я думаю, проблема в том, что перед проверкой шаблона он связывает строковое значение с BigDecimal, что заставляет его терпеть неудачу.
Одно уродливое решение может быть в методе setSize setter. Я могу проверить ближайшее значение и сделать что-то, если оно не является числом. Но мне это не нравится.
Что такое лучший способ справиться с такими проблемами привязки?
FYI: Я знаю, что я сделаю проверку на стороне клиента (используя JQuery) последним. Теперь я предполагаю, что пользователь каким-то образом передает проверку на стороне клиента.
Причина, по которой я хотел иметь шаблон, должен находиться на центральном месте, где все входные символы подтверждены. Поэтому мне не нужно проверять, является ли оно отрицательным или нет, null или нет, содержит цифру или нет. Второй возможен, но, как вы сказали, это может быть плохо. Для вашего последнего вопроса система была разработана 10 лет назад, поэтому мы должны использовать только BigDecimal. – WowBow