2010-05-17 2 views
2

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

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 для bean-компонента, и аргумент равен 0, а не null, как ожидалось. Чтобы быть более точным, свойство setter вызывается дважды, один раз с нулевым аргументом, второй раз с аргументом 0 значения.

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

Заранее спасибо.

ответ

2

При возврате 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 
+0

Благодарим вас за ответ. Я попробую. Я использую Websphere Application Server Community Edition, поэтому мне нужно будет выяснить, как его настроить. Кроме того, у меня такая же проблема со свойствами String, для которой я не включил никаких конвертеров. – Vladimir

+0

JSF 1.1 или 1.2? Если JSF 1.1, преобразователи 'String' по дизайну игнорируются. Если JSF 1.2, сделайте то же самое. – BalusC

+0

Я использую JSF 1.2. К сожалению, я до сих пор не смог запустить WAS CE с аргументами VM. – Vladimir

3

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

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

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

В моем webapp проблема была двойным полем на бэкбоне, который все время получал присвоенное значение 0.0 вместо null.

+1

Это на самом деле хороший «обходной путь»! – BalusC