【问题标题】:OmniFaces - ConverterManager operating modeOmniFaces - ConverterManager 操作模式
【发布时间】:2016-01-21 13:55:27
【问题描述】:

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

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

为什么不需要 OmniFaces 导入以及如何告知框架使用 ConverterManager?是否只是将 OmniFaces 库添加到构建路径?

对不起,如果这是一个愚蠢的问题。感谢您的任何解释。

【问题讨论】:

    标签: jsf omnifaces


    【解决方案1】:

    转换器实例位于通过 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 对于解决来自旧版本的 3rd 方库(如 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 的委托正在发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 2012-04-17
      • 2011-11-10
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多