2010-03-15 5 views
3

Я создал простой HtmlInputTextNullPointerException Binding не работает JSF управляемый компонент

<h:inputText binding="#{IndexBean.objUIInput}" /> 

Тогда в моем управляемом компоненте, это: -

private UIInput objUIInput; 

    public UIInput getObjUIInput() { 
     objUIInput.setValue("laala"); 
     return objUIInput; 
    } 

    public void setObjUIInput(UIInput objUIInput) { 
     System.out.println("Set!!"); 
     this.objUIInput = objUIInput; 
    } 

Но я всегда получаю NullPointerException. Нужно ли мне что-либо делать на моей странице JSF? как мы делаем jsp: usebean setproperty? Пожалуйста, помогите мне.

+1

Как вы заявили о своем управляемом компоненте? когда вы получаете исключение? – Bozho

+0

Я не касался управляемого bean вообще. Он генерируется NetBeans 6.8 IDE. Он имеет аннотацию @ManagedBean. Кроме того, я хотел бы сказать, что если я привяжу его к любому другому свойству, например value = "{IndexBean.sayHello}", он работает отлично. Но как только я использую атрибут привязки, он терпит неудачу. Кроме того, если я инициализирую экземпляр HtmlInputText новым ключевым словом, он работает хорошо. В чем проблема? Я получаю исключение, когда обновляю страницу. Я имею в виду, что сеттер вообще не уволен. Я ничего не вижу в Glassfish Console, поскольку я печатал System.out.println («Set!») ;. Пожалуйста помоги! – TCM

ответ

5

Всякий раз, когда вы хотите изменений по умолчанию состояния/поведение компонента до отображения, то вам необходимо создать экземпляр это самостоятельно. То есть при декларировании:

private UIInput objUIInput = new HtmlInputText(); 

или во время строительства:

public Bean() { 
    this.objUIInput = new HtmlInputText(); 
} 

или, как это было предложено Bozho, используя @PostConstruct:

@PostConstruct 
public void init() { 
    this.objUIInput = new HtmlInputText(); 
} 

(который пройдет после строительства боба и инициализация/настройка всех управляемых свойств).

И действительно, предпочтительно, чтобы вы не делали бизнес-логику в геттерах/сеттерах. Они должны использоваться для доступа к свойствам бобов, и их можно назвать более одного раза во время жизни боба.

В соответствии с комментариями вы также можете переместить вызов UIInput#setValue() на метод setter. JSF будет вызывать его один раз непосредственно после предварительной обработки компонента.

public void setObjUIInput(UIInput objUIInput) { 
    this.objUIInput = objUIInput; 
    this.objUIInput.setValue("laala"); 
} 
+0

Я понимаю BalusC, но я использую компоненты Primefaces, и это не работает. Если я создаю новые экземпляры объекта, это не сработает. ! Позвольте мне сказать так: - Моим требованием является только то, что JSF должен передать ссылку на мой управляемый bean-компонент, и я должен работать над THAT только для справки, никаких новых экземпляров, которые я хочу создать, иначе это не сработает. знаю, что вы не поверите, но так оно и есть. @PostConstruct - отличный способ, но он не будет работать, потому что он запускается после инъекций зависимостей (если есть) и перед сеттерами. Мне нужно, чтобы что-то было запущено после того, как устроитель запущен – TCM

+1

Это был просто пример. Замените «HtmlInputText» любым компонентом, которым вы на самом деле привязываете его. Альтернативно, вы можете просто добавить nullcheck в методе getter или (лучше) переместить вызов 'setValue()' методу setter. JSF будет вызывать сеттер непосредственно после предварительной обработки фактического компонента. Там гарантировано не пустое. – BalusC

+0

Хорошо! Большой! Если он вызван только один раз, тогда проблем нет! Спасибо друг! Теперь ты наконец понял меня. :) Вы люди великие. Время отклика, которое мы имеем на этом форуме, просто потрясающее. Кажется, что мы люди болтаем. Погружные камни! – TCM

1

Когда вы связываете компонент, геттер и сеттер должны быть простыми - только get/set - никакой логики внутри них.

Возможно, жизненный цикл JSF вызывает геттер, чтобы проверить, нужно ли ему создавать экземпляр компонента, а геттер сначала выбрал бы NPE.

Удалите всю логику с вашего геттера или, по крайней мере, добавьте нулевую проверку.

На самом деле, я советую не использовать привязку вообще.

Если вы хотите установить начальное значение для своего компонента, используйте метод, аннотированный с помощью @PostConstruct, и назначьте его там, а затем используйте атрибут value.

+0

Не работает чувак. Пробовал это всеми возможными способами: - 1) использование @PostConstruct, а затем прямое значение атрибута значения не работает, потому что setter запускается после @PostConstruct.Обычно я хочу что-то сделать, только когда JSF передал ссылку объекта компонента на мой управляемый компонент. 2) Если я поставил нечетную проверку на геттер, а затем установил его значение, на этот раз нет NPE, но я не вижу значения в компоненте 3) если я установил в сеттер после того, как JSF прошел ссылка на управляемый bean-компонент отлично работает. Но это своего рода патч-работа :( Пожалуйста, помогите мне другу – TCM

Смежные вопросы