2015-07-06 25 views
2

什麼應能正常工作,如果我不指定在確定@FacesConverter註釋轉換-ID和(或)forClass? 例如:@FacesConverter無需轉換-id和forClass

@FacesConverter 
public class SplitConverter implements Converter{ 

@Override 
public Object getAsObject(FacesContext context, UIComponent component, 
     String value) { 
    //... 
} 
@Override 
public String getAsString(FacesContext context, UIComponent component, 
     Object value) { 
    //... 

} 

後faces-config.xml中registred和使用.xhtml頁面:

<h:inputText id="badges" value="#{article.badges}" 
    required="true"> 
    <f:converter converterId="com.katcgr.SplitConverter" /> 
</h:inputText> 

,一切都工作。該文件說,

如果轉換器-id爲空字符串,Application.addConverter(java.lang.Class中,java.lang.String中)被調用時,通過轉換器換類作爲第一個參數,派生的轉換器類作爲第二個參數。

但是爲什麼一切正常,即使我沒有指定forClass?

+0

*「在faces-config.xml中註冊後」*究竟如何?因此,您基本上是通過''輸入XML來手動註冊轉換器,而不是依靠'@ FacesConverter'?如果您使用註釋,則在XML中註冊應該完全沒有必要。 – BalusC

+0

@BalusC是的,我已經安裝了PrimeFaces。我也看到,轉換器正在工作,沒有指定'converterId'。只有一些擴展名,例如'pe:CKEditor'不能正常工作。 – katch

+0

@BalusC謝謝,我想我得到了我的問題的答案。據我瞭解,它的工作比較穩定,因爲我在項目PrimeFaces。 – katch

回答

2

後faces-config.xml中registred登記經由

@FacesConverterfaces-config.xml<converter>是互斥的,由此XML註冊覆蓋任何註釋註冊。因此,當您的轉換器通過以XML註冊的轉換器ID進行引用時,轉換器實例的行爲基本上就像沒有註釋一樣。如果刪除XML註冊,那麼你應該檢索以下例外指定converterId

javax.faces.FacesException: Expression Error: Named Object: com.katcgr.SplitConverter not found. 
    at com.sun.faces.application.ApplicationImpl.createConverter(ApplicationImpl.java:1339) 
    at javax.faces.application.ApplicationWrapper.createConverter(ApplicationWrapper.java:393) 
    at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.createConverter(ConverterTagHandlerDelegateImpl.java:158) 
    ... 

這基本上只有當你有一個

@FacesConverter("com.katcgr.SplitConverter") 

不過,若你同時刪除XML配置工作和<f:converter>,那麼它會「工作」,因爲@FacesConverter沒有明確forClass會自動調用每一個bean屬性這是java.lang.Object(基本上,一切)的實例,它沒有更具體的轉換器已經registere d。換句話說,你的轉換器會像:

@FacesConverter(forClass=Object.class) 

它希望並不需要複雜的解釋,這是一個非常糟糕的做法。它也會混淆PrimeFaces,因爲它會在內部初始化並將它用作String類的默認轉換器。

相關問題