2015-04-23 16 views
2

我有以下的註釋自定義轉換器定義自定義轉換器時,哪一個在FacesConverter註釋中的value和forClass之間取得更高的優先級?

@FacesConverter(value="capsConverter", forClass=String.class) 
     public class CapsConverter implements Converter{ 
     @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     return value.toUpperCase(); 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component,Object value) { 
     if(value!=null && value instanceof String){ 
      String s = (String)value; 
      s = WordUtils.capitalize(s.toLowerCase()); 
      return s; 
     } 
     return null; 
    } 

    } 

問題是,轉換器有時被稱爲甚至當我沒有顯式調用它在我的網頁,請問forClass有什麼關係的干擾我inputTexts,我應該只使用值並刪除forClass = String.class?

任何光棚的高度讚賞。

回答

4

它實際上是兩種不同的註冊轉換器的方法。兩者相互排斥。他們彼此沒有影響,你可以省略其中一個。

forClass屬性將在JSF應用程序中註冊轉換器,以在處理和呈現指定類型的每個模型值期間引入轉換器。換句話說,對於forClass=String.class,除非關聯的輸入/輸出組件已經聲明瞭顯式轉換器,否則轉換器將隱式調用String類型的輸入和輸出。

一般使用forClass只自定義/複雜類型,而不是如StringLongBigDecimal等針對JSF已經內置隱含的轉換器標準類型。

所以你應該刪除它,只依靠轉換器ID。

@FacesConverter("capsConverter") 
<h:someComponent ... converter="capsConverter" /> 

forClass正確器具將是一個Person實體和String之間的以下變換器代表其ID

@FacesConverter(forClass=Person.class) 

上類似

的一個例子0
<f:viewParam name="id" value="#{bean.person}" /> 

其中表示一個實體ID的輸入請求參數轉換象下面

/edit-person.xhtml?id=42 

在豆一個fullworthy實體屬性(不必在Bean的任何額外的邏輯)

private Person person; 
+0

非常感謝BalusC爲我澄清這個問題。非常感激。 –

+0

不客氣。 – BalusC

+0

你似乎沒有意識到,只要它對理解和解決問題有幫助(大部分),就應該接受答案。在[先前提出的問題的長列表](http://stackoverflow.com/users/1633623/raymond-nakampe?tab=questions)中,您只接受了一次,而且這是明確的請求。有更多的問題似乎解決了您的問題(基於評論),但它們都未被接受。這不是Stack Overflow的工作方式。請全部查看。另請參閱[如何接受答案的工作?](http://meta.stackexchange.com/a/5235) – BalusC