Значение свойства управляемого компонента не установлено в ноль - PullRequest
2 голосов
/ 17 мая 2010

Я новичок в JSF, поэтому этот вопрос может быть странным. У меня есть значение компонента inputText, привязанное к свойству управляемого компонента типа Float. Мне нужно установить свойство в null, когда поле inputText пусто, а не в 0 значение. По умолчанию это не сделано, поэтому я добавил конвертер с использованием следующего метода:

public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException {
 if (StringUtils.isEmpty(arg2)) {
  return null;
 }

 float result = Float.parseFloat(arg2);
 if (result == 0) {
  return null;
 }
 return result;
}

Я зарегистрировал конвертер и назначил его компоненту inputText. Я зарегистрировал аргумент arg2, а также записал возвращаемое значение из метода getAsObject. По моему журналу я вижу, что он возвращает нулевое значение. Но я также записываю свойство setter на базовый компонент, и аргумент равен 0, а не нулю, как ожидалось. Чтобы быть более точным, это свойство setter вызывается дважды, один раз с нулевым аргументом, второй раз с 0 значением аргумента.

Он по-прежнему устанавливает значение вспомогательного компонента на 0. Как я могу установить значение на ноль?

Спасибо заранее.

Ответы [ 2 ]

3 голосов
/ 10 ноября 2010

Я знаю, что это старый пост, но он мне помог. Я хотел добавить фрагмент кода, который, кажется, работает в моем веб-приложении, чтобы установить переменную, о которой упоминал BalusC, без необходимости указывать ее в качестве аргумента виртуальной машины:

public class ServletContextListenerImpl 
        implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.getProperties().put(
            "org.apache.el.parser.COERCE_TO_ZERO", "false");
    }
}

Я не могу гарантировать, что люди, развертывающие мое веб-приложение, правильно добавят аргументы виртуальной машины в сценарий запуска Tomcat 6, поэтому я чувствую себя безопаснее встраивая его в код моего веб-приложения. Это заставило проблему уйти. Я использую Apache MyFaces JSF 1.2.

В моем веб-приложении проблема заключалась в том, что в базовом компоненте было поле Double, которому продолжалось присваиваться значение 0.0 вместо нуля.

2 голосов
/ 17 мая 2010

При возврате null в getAsObject() вам также нужно установить значение, переданное компонентом, на null.

if (result == null) {
    ((EditableValueHolder) component).setSubmittedValue(null);
}

Однако существует проблема, связанная с конкретной средой, а именно тот факт, что синтаксический анализатор EL в Tomcat 6.0.16 или новее по-прежнему будет приводить к этому значению как 0 на стороне просмотра, даже если getAsString() возвращает null. Вы можете обойти это, добавив следующую строку в аргументы VM Tomcat:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...