2011-05-29 103 views
0

this article,我實現了@ManagedProperty(value="#{settings}")到我的支持bean:@ManagedProperty - 設置getter和setter

BEAN Bde.java:

@Entity 
@Table(name="bdeDATA") 
@ViewScoped 
@ManagedBean(name="BDE") 
public class Bde implements Serializable 
{ 
    /**/ 
    private static final long serialVersionUID = -705775502999920673L; 

    @Transient 
    @ManagedProperty(value = "#{settings}") 
    private Settings settings; 

    @Id 
    private Date create_date; 
    private Integer person_ID; 

    public Date getCreate_date() { 
    return create_date; 
    } 
    public void setCreate_date(Date create_date) { 
    this.create_date = create_date; 
    } 
    public Integer getPerson_ID() { 
    return person_ID; 
    } 
    public void setPerson_ID(Integer person_ID) { 
    this.person_ID = person_ID; 

    try 
    { 
     Settings.PWKITEM = (Pwk)Tools.find(person_ID); 
     if (Settings.PWKITEM != null) settings.setUserfound(true); /// PROBLEMATIC 
    } 
    catch (Exception e) 
    { 
     Tools.setErrorMessage("NOT FOUND "+e.getMessage()); 
    } 
    } 

    // ManagedProperty settings --------------------------------------------- 
    public Settings getSettings() { 
    return settings; 
    } 
    public void setSettings(Settings settings) { 
    this.settings = settings; 
    } 
    public void setUserfound (boolean userfound){ 
    settings.setUserfound(userfound); 
    } 
    public boolean isUserfound() { 
    return settings.isUserfound(); 
    } 
} 

Settings.java

@SessionScoped 
@ManagedBean(name="settings") 
public class Settings implements Serializable 
{ 
    /**/ 
    private static final long serialVersionUID = 8613411699115714416L; 

    public static Pwk PWKITEM = new Pwk(); 
    private boolean userfound = false; 

    public boolean isUserfound() { 
    return userfound; 
    } 
    public void setUserfound(boolean userfound) { 
    this.userfound = userfound; 
    } 
} 

XHTML(AJAX調用setPerson_ID):

<h:inputText id="persId" value="#{bean.bdeitem.persId}"> 
    <f:ajax event="blur" render="name" execute="@this" /> 
</h:inputText> 
<h:inputText id="name" value="#{bean.pwkitem.name}"/> 

問題是在try/catch

  • 沒有條件,找到對象。
  • 當我將條件例如更改爲if (Settings.PWKITEM != null) System.out.println("HELLO")時,HELLO被寫入控制檯。
  • 如果我嘗試添加userfound setter,它會被捕獲(「未找到」)。

我在做什麼錯了?

+0

我覺得這很可怕。會話scoped bean中的靜態屬性?這不應該是在應用程序範圍的bean?你瞭解應用程序/會話/查看/請求範圍的生命週期嗎?你明白'靜態'的含義嗎? – BalusC 2011-05-30 11:36:05

+0

我以爲我會這樣做,但現在我明白了,我並沒有把它說得很好。如果我必須及時完成我的單身工作,並且我在java中處女,那會發生這種情況:) – gaffcz 2011-05-30 11:42:23

+0

我很想發表一個答案,但是對於功能要求我還不完全清楚。這些設置是用戶特定的還是應用程序特定的? 'userfound'應該代表什麼?是否有人登錄?這是誰的信息?用戶本身?或者每個人訪問webapp? 「PWKITEM」代表什麼? – BalusC 2011-05-30 11:45:27

回答

2

你的問題看起來非常混亂。你首先展示一些bean代碼,然後在甚至提到任何問題之前立即說出「我認爲這是一個Ajax問題」。問題的其餘部分沒有多大區別。

直接回答你的問題的最後一部分,但:

Ican't理解,爲什麼它找到項目寫入正確的名稱來安慰,之後immediatelly的是,它寫入找不到捕獲異常???? ....

您正在訪問靜態的Settings。你在課堂上宣佈的實例似乎沒用。如果Tools.find引發異常並因此沒有分配新值,則完全可能在靜態Settings.PWKITEM字段中仍存在舊值。這並不奇怪。

請注意日誌從上到下讀取。因此,不是打印「***」,然後拋出異常,但首先拋出異常並打印「未找到」,然後僅打印「***」。

此外,你的方法對所有這些看起來有問題。聲明一個實體也是一個(JSF)的支持bean很少是一個好主意。在一個實體中使用對某種服務或DAO類的引用也並不總是一個好主意,但是在一個被認爲是一個簡單的ID設置器的方法中這樣做看起來是錯誤的。

然後使用靜態引用更加錯誤,如果關閉,則使用方法和非靜態變量名稱中的下劃線違背常見的Java代碼慣例。

+0

謝謝,我正在改變它,因爲我在解決方案中前進。這是混亂,我知道:-)它第一次,我使用@ManagedProperty,我有點困惑... – gaffcz 2011-05-29 09:53:16

+0

沒有意圖任何打算,但它表明。學習和改進代碼祝你好運!我們都必須開始一天;) – 2011-05-29 09:55:06