转换器实例位于通过 Application#createConverter() 创建的掩护之下。
Converter converter = facesContext.getApplication().createConverter(idOrClass);
就像many abstract artifacts in JSF API,Application 跟在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 的委托正在发生。