Образцы конвертов находятся под обложками, созданными с помощью Application#createConverter()
.
Converter converter = facesContext.getApplication().createConverter(idOrClass);
Вроде как many abstract artifacts in JSF API, то Application
следует decorator (wrapper) pattern, как вы можете найти over all place in java.io.*
. Вы можете предоставить пользовательские один через <factory>
в faces-config.xml
как и 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
происходит.