2016-01-21 23 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正在发生的事情。