2016-01-21 24 views
2

我有一個JSF項目,我使用OmniFaces在@FacesConverter中啓用@EJB注入。使用showcase的代碼,它運行良好。OmniFaces - ConverterManager操作模式

但我的魔杖,瞭解多一點,什麼是表面之下發生的事情,我預計從轉換器OmniFaces部分進口,但也有剛剛從javax.faces.*

進口爲什麼沒有OmniFaces導入必要以及如何是告訴使用ConverterManager的框架?只需將OmniFaces庫添加到構建路徑中?

對不起,如果這是一個愚蠢的問題。感謝您的任何解釋。

回答

3

轉換器實例在通過Application#createConverter()創建。

Converter converter = facesContext.getApplication().createConverter(idOrClass); 

等爲many abstract artifacts in JSF APIApplication遵循decorator (wrapper) pattern,就像你可以找到over all place in java.io.*。您可以在faces-config.xml通過<factory>提供一個自定義的OmniFaces在沒有低於其/META-INF/faces-config.xml

<factory> 
    <application-factory>org.omnifaces.application.OmniApplicationFactory</application-factory> 
</factory> 

應用工廠實現歸結爲:

public class OmniApplicationFactory extends ApplicationFactory { 

    private final ApplicationFactory wrapped; 

    public OmniApplicationFactory(ApplicationFactory wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public Application getApplication() { 
     return new OmniApplication(wrapped.getApplication()); 
    } 

    @Override 
    public void setApplication(Application application) { 
     wrapped.setApplication(application); 
    } 

    @Override 
    public ApplicationFactory getWrapped() { 
     return wrapped; 
    } 

} 

(該actual implementation是一點點更復雜的工作來解決來自較舊版本的第三方庫(如Seam,Weld和Spring WebFlow)的破碎的應用程序工廠(它們已經長期固定在他們身邊)

OmniApplication實施歸結爲:

public class OmniApplication extends ApplicationWrapper { 

    private final Application wrapped; 
    private final ConverterManager converterManager; 

    public OmniApplication(Application wrapped) { 
     this.wrapped = wrapped; 
     converterManager = BeanManager.INSTANCE.getReference(ConverterManager.class); 
    } 

    @Override 
    public Converter createConverter(String converterId) { 
     Converter converter = converterManager.createConverter(getWrapped(), converterId); 
     return (converter != null) ? converter : super.createConverter(converterId); 
    } 

    @Override 
    public Application getWrapped() { 
     return wrapped; 
    } 

} 

你看,有代表團ConverterManager正在發生的事情。