2010-03-15 63 views
3

我創建了一個簡單的HtmlInputTextNullPointerException異常綁定不工作JSF管理的bean

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

然後在我管理的bean,它是: -

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

您是如何聲明託管bean的?你什麼時候得到異常? – Bozho 2010-03-15 15:43:43

+0

我根本沒有碰到託管bean。它由Netbeans 6.8 IDE生成。它有@ManagedBean註釋。此外,我想告訴的一件事是,如果我將它綁定到任何其他屬性,如value =「{IndexBean.sayHello}」,它的工作非常好。但只要我使用綁定屬性,它就會失敗。此外,如果我用新的關鍵字初始化HtmlInputText實例,它工作得很好。可能是什麼問題?我刷新頁面時發生異常。我的意思是二傳手並沒有被解僱。我沒有在Glassfish Console中看到任何東西,因爲我已經打印了System.out.println(「Set!」);.請幫忙! – TCM 2010-03-15 15:47:55

回答

5

每當你想變化組件的默認狀態/行爲顯示之前,那麼你需要實例化它自己。即聲明中:

private UIInput objUIInput = new HtmlInputText(); 

或施工過程中:

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

,或者如Bozho建議,使用@PostConstruct

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

(這將發生施工bean的和所有託管屬性的初始化/設置)。

事實上,你最好不要在getters/setters中做任何業務邏輯。它們將被用於訪問bean屬性,並且在bean的生命中可以多次調用它們。

根據意見,您也可以將UIInput#setValue()調用移動到setter方法。在預先創建組件之後,JSF將直接調用它。

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

我瞭解BalusC,但我使用Primefaces組件,它不會這樣工作如果我創建對象的新實例它將無法正常工作相信我! 讓我這樣說: - 我的要求只是JSF應該將引用傳遞給我的託管bean,我應該只在相同的引用上工作,不需要創建新實例,否則它不起作用。知道你不會相信,但這是它的方式 @PostConstruct是偉大的方式,但它不會工作,因爲它在依賴注入(如果有的話)之後和setters之前被解僱。我希望在setter被解僱後被解僱。 – TCM 2010-03-15 16:29:56

+1

這只是一個例子,將'HtmlInputText'替換爲你實際綁定的Primefaces組件,或者你可以添加getter方法中的空檢查或(更好地)將'setValue()'調用移動到setter方法。在預先創建實際組件後,JSF將直接調用setter。它保證非null。 – BalusC 2010-03-15 16:36:04

+0

好的!大!如果它只被調用一次,那麼沒問題!謝謝你,朋友!現在你終於明白了我。 :) 你們人很棒。我們在這個論壇上的反應時間簡直太棒了。感覺好像我們人在聊天。 Stackoverflow的岩石! – TCM 2010-03-15 16:47:09

1

當你綁定一個組件時,getter和setter應該是簡單的 - 只有get/set - 它們內部沒有邏輯。

也許JSF生命週期調用getter來檢查它是否需要實例化組件,並且getter最初會拋出一個NPE。

從您的getter中刪除所有的邏輯,或者至少添加一個空的檢查。

其實,我建議不要使用綁定。

如果要爲組件設置初始值,請使用註釋爲@PostConstruct的方法並在該處指定值,然後使用value屬性。

+0

這不是工作夥計。嘗試所有可能的方式: - 1)使用@PostConstruct,然後直接設置值屬性不起作用,因爲setter被激發後@PostConstruct。我通常只想在JSF將組件對象的引用傳遞給託管bean時執行某些操作。 2)如果我在getter上設置了非空值檢查,然後設置它的值,這次沒有NPE被觸發,但我沒有看到組件 中的值3)如果在JSF通過後設置了setter參考託管的豆它很好。但是這是一種補丁工作:( 請幫助我的朋友 – TCM 2010-03-15 16:17:09