2012-02-25 301 views
2

我有一個自定義轉換器是這樣的:JSF自定義轉換器

@Override 
public Object getAsObject(FacesContext facesContext, UIComponent component, String str) { 
    System.out.println("vadeConverter before getAsObject(" + str); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd"); 

    String values[] = str.split(":"); 
    Vade vade = new Vade(); 
    if (values.length > 1) { 
     vade.setId(Integer.parseInt(values[0])); 
     vade.setEtiket(values[1]); 
     try{ 
      vade.setTakasTarihi(dateFormat.parse(values[2])); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     }   
    } 
    System.out.println("vadeConverter after getAsObject(" + vade.toString()); 
    return vade; 
} 

@Override 
public String getAsString(FacesContext context, UIComponent component, 
     Object object) { 
    Vade vade = (Vade) object; 
    String str = ""; 
    System.out.println("vadeConverter before getAsString(object) -> " + vade.toString()); 
    if (vade != null) { 
     str = vade.getId().toString()+":"+ 
       vade.getEtiket()+":"+ 
       vade.getTakasTarihi().toString() 
       ; 
    } 
    System.out.println("vadeConverter after getAsString(object) -> " + str); 
    return str; 
} 

在控制檯輸出:

vadeConverter before getAsString(object) -> Vade{id=7etiket=T+0takasTarihi=2012-02-21} 
vadeConverter after getAsString(object) -> 7:T+0:2012-02-21 
vadeConverter before getAsString(object) -> Vade{id=12etiket=T+2takasTarihi=2012-02-27} 
vadeConverter after getAsString(object) -> 12:T+2:2012-02-27 
vadeConverter before getAsString(object) -> Vade{id=13etiket=T+3takasTarihi=2012-02-28} 
vadeConverter after getAsString(object) -> 13:T+3:2012-02-28 
vadeConverter before getAsString(object) -> Vade{id=14etiket=T+4takasTarihi=2012-02-29} 
vadeConverter after getAsString(object) -> 14:T+4:2012-02-29 
vadeConverter before getAsString(object) -> Vade{id=15etiket=T+5takasTarihi=2012-03-01} 
vadeConverter after getAsString(object) -> 15:T+5:2012-03-01 
vadeConverter before getAsString(object) -> Vade{id=16etiket=T+6takasTarihi=2012-03-02} 
vadeConverter after getAsString(object) -> 16:T+6:2012-03-02 
vadeConverter before getAsString(object) -> Vade{id=17etiket=T+7takasTarihi=2012-03-03} 
vadeConverter after getAsString(object) -> 17:T+7:2012-03-03 
vadeConverter before getAsString(object) -> Vade{id=18etiket=T+8takasTarihi=2012-03-04} 
vadeConverter after getAsString(object) -> 18:T+8:2012-03-04 
vadeConverter before getAsString(object) -> Vade{id=19etiket=T+9takasTarihi=2012-03-05} 
vadeConverter after getAsString(object) -> 19:T+9:2012-03-05 

當我選擇從控制檯我得到這個selectOneMenu用於值:

vadeConverter before getAsObject(12:T+2:2012-02-27 
vadeConverter after getAsObject(Vade{id=12etiket=T+2takasTarihi=Fri Jan 27 00:02:00 EET 2012} 

當然,因爲我得到驗證錯誤。我相信我以正確的方式編寫轉換器,但我不知道此代碼有什麼問題。

回答

2

您正在使用mm而不是MM來表示月份。 mm代表分鐘。請注意,您得到Jan而不是Feb,並且您獲得2分鐘而不是0分鐘。您可以找到格式化模式的語法in SimpleDateFormat javadoc

然而,更可靠的是使用getTime()new Date(time)而不是toString()SimpleDateFormat#parse()。這樣你也不依賴於默認的toString()結果。

+0

對!非常感謝!有時候小錯誤會讓你付出很多代價。 – lamostreta 2012-02-27 14:58:50

+0

不客氣。 – BalusC 2012-02-27 15:08:33

+0

我很擅長通過書籍學習。有什麼書可以推薦,這對JSF來說是必不可少的嗎? – lamostreta 2012-02-28 07:21:31