转换器实例在通过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是一点点更复杂的工作来解决来自较旧版本的第三方库(如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
正在发生的事情。