Проверка значения int

#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.