#java #validation #jsf #jsf-2
#java #проверка #jsf #jsf-2
Вопрос:
У меня возникли трудности с выполнением простой проверки текстового поля, которое имеет в качестве значения переменную int.
Мне нужно следующее;
- разрешать только цифры
- не допускайте значения 0 или ниже
- Заполнение поля в соответствии с приведенными выше правилами должно быть обязательным.
Это средство проверки, которое я создал, но оно работает не так, как я хочу. Можете ли вы взглянуть на это и сказать мне, где я совершаю ошибку?
public void validateProductValue(FacesContext context,
UIComponent validate, Object value) {
FacesMessage msg = new FacesMessage("");
String inputFromField = (String) value;
String simpleTextPatternText = "^([0-9] $)?";
Pattern textPattern = null;
Matcher productValueMatcher = null;
textPattern = Pattern.compile(simpleTextPatternText);
productValueMatcher = textPattern.matcher(inputFromField);
if (!productValueMatcher.matches()) {
msg = new FacesMessage("Only digits allowed");
throw new ValidatorException(msg);
}
if (inputFromField.length() <= 0) {
msg = new FacesMessage("You must enter a value greater than 0");
throw new ValidatorException(msg);
}
if (Integer.parseInt(inputFromField.toString().trim()) <= 0) {
msg = new FacesMessage("0 or bellow is not permited");
throw new ValidatorException(msg);
}
}
Вот как я вызываю поле:
<h:inputText id="productValue" value="#{newOfferSupportController.productValue}" validator="#{newOfferSupportController.validateProductValue}"/>
Это проверка, показанная в браузере:
Текст
/newoffer.xhtml @44,184
validator="#{newOfferSupportController.validateProductValue}":
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
Комментарии:
1. Трудно прочитать сообщение о проверке, не могли бы вы скопировать текст или увеличить изображение?
2. Опубликованная вами ошибка указывает на то, что вам передается целочисленный объект, и попытка преобразовать его в строку завершается неудачей.
Ответ №1:
Вы должны быть в состоянии обеспечить выполнение условий, которые вы ищете, просто используя регулярное выражение: ^[1-9] [0-9]*$
Комментарии:
1. не могли бы вы поделиться каким-нибудь примером?
Ответ №2:
Во-первых, ваше регулярное выражение неверно. Вам нужно поставить $
в конце, вот так ^([0-9] )?$
.
Это работает не так, как вы могли бы ожидать:
if (inputFromField.length() <= 0) {
msg = new FacesMessage("You must enter a value greater than 0");
throw new ValidatorException(msg);
}
inputFormField.length()
это длина текста, которая не может быть меньше 0, и даже если бы она была больше 0, вы могли бы ввести отрицательное значение, например, "-1"
которое имеет длину 2.
Если я правильно вижу исключение, вы получаете ClassCastException. Взгляните на строку 44 (о которой вам сообщает сообщение об исключении), которое, я полагаю, String inputFromField = (String) value;
Вы определили конвертер для этого поля? Если это так, value
это может быть Integer
и не a String
.
Редактировать:
Обратите внимание, что ваш валидатор на самом деле пытается сделать две вещи: преобразовать входные данные в целое число и проверить целочисленное значение. В JSF обычно есть два класса, которые это делают:
- сначала вызывается конвертер для преобразования строки в целое число и наоборот, особенно если ваше поле модели является целым числом — именно здесь вы должны проверить, действительно ли вы получили целое число
- во-вторых, вы проверяете целочисленное значение, например, применяя минимум — здесь вы используете средство проверки
Также обратите внимание, что уже есть встроенные средства проверки, которые делают то, что вы хотите. Взгляните на <f:validateLongRange minimum = "0"/>
, например.
Ответ №3:
Во-первых, действительно ли значение является экземпляром String? Или это может быть приведено к целому числу?
Если нет, сделайте это:
if (value == null) {
throw new ValidatorException("No input value");
}
String inputValue = (String) value;
try {
int v = Integer.parse(inputValue);
if (v <= 0) {
throw new ValidatorException("Input less than or equal to 0");
}
} catch (NumberFormatException e) {
throw new ValidatorException("Input is not an integer");
}
Комментарии:
1. Если значение не является строкой, вы все равно получите ClassCastException.