首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OmniFaces - ConverterManager工作模式

OmniFaces - ConverterManager工作模式
EN

Stack Overflow用户
提问于 2016-01-21 13:55:27
回答 1查看 101关注 0票数 2

我有一个JSF项目,在该项目中,我使用OmniFaces在@FacesConverter中启用@EJB注入。使用来自showcase的代码,效果很好。

但是我想了解更多,表面下发生了什么,我希望在转换器中有一些来自OmniFaces的导入,但是只有来自javax.faces.*的导入。

为什么不需要OmniFaces导入,框架是如何被告知使用ConverterManager的?它仅仅是通过将OmniFaces库添加到构建路径吗?

抱歉,如果这是个愚蠢的问题。谢谢你的解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-21 14:28:40

转换器实例在通过Application#createConverter()创建的封面之下。

代码语言:javascript
复制
Converter converter = facesContext.getApplication().createConverter(idOrClass);

就像JSF中的许多抽象构件一样,Application遵循装潢器(包装)图案,就像您可以找到java.io.*一样。您可以通过<factory>faces-config.xml中提供自定义的,就像OmniFaces在其/META-INF/faces-config.xml中所做的那样

代码语言:javascript
复制
<factory>
    <application-factory>org.omnifaces.application.OmniApplicationFactory</application-factory>
</factory>

应用程序工厂的实现归结为:

代码语言:javascript
复制
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;
    }

}

( https://github.com/omnifaces/omnifaces/blob/2.2/src/main/java/org/omnifaces/application/OmniApplicationFactory.java对于解决来自旧版本的第三方库(如Seam、Weld和Spring )的应用程序工厂来说有点费解(顺便说一句,它们已经被长期固定在一起了)。

OmniApplication实现归结为:

代码语言:javascript
复制
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的代表团就在那里。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34925732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档