2016-01-21 2 views
2

У меня есть проект JSF, где я использую OmniFaces, чтобы включить впрыск @EJB в @FacesConverter. С кодом от showcase это получилось хорошо.OmniFaces - режим работы преобразователя

Но палочка понять немного больше, то, что происходит под поверхностью, и я ожидал некоторый импорт из OmniFaces в конвертере, но только импортирует из javax.faces.*

Почему нет OmniFaces не импортировать необходимо и как это рамочная программа, используемая для использования ConverterManager? Это просто добавление библиотек OmniFaces в путь сборки?

Извините, если это глупый вопрос. Спасибо за любое объяснение.

ответ

3

Образцы конвертов находятся под обложками, созданными с помощью 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 происходит.

Смежные вопросы