Проверка значения int - PullRequest
1 голос
/ 01 мая 2011

У меня возникают трудности при простой проверке текстового поля, имеющего в качестве значения переменную 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}"/>

Это проверка показывается в браузере: enter image description here

Текст

/newoffer.xhtml @44,184 
validator="#{newOfferSupportController.validateProductValue}":
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

Ответы [ 3 ]

1 голос
/ 01 мая 2011

Вы должны быть в состоянии обеспечить соблюдение ваших условий, просто используя регулярное выражение: ^ [1-9] + [0-9] * $

1 голос
/ 01 мая 2011

Прежде всего, ваше регулярное выражение неверно. Вам нужно поставить $ в конце, вот так ^([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, а не String.

Edit:

Обратите внимание, что ваш валидатор на самом деле пытается сделать две вещи: преобразовать входные данные в целое и проверить значение целого числа. В JSF у вас обычно есть два класса, которые делают это:

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

Также обратите внимание, что уже есть встроенные валидаторы, которые делают то, что вы хотите. Взгляните на <f:validateLongRange minimum = "0"/> например.

0 голосов
/ 01 мая 2011

Во-первых, действительно ли значение является экземпляром String?Или это может быть приведено к Integer?

Если нет, сделайте это:

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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...