我有一个JSF项目,在该项目中,我使用OmniFaces在@FacesConverter中启用@EJB注入。使用来自showcase的代码,效果很好。
但是我想了解更多,表面下发生了什么,我希望在转换器中有一些来自OmniFaces的导入,但是只有来自javax.faces.*的导入。
为什么不需要OmniFaces导入,框架是如何被告知使用ConverterManager的?它仅仅是通过将OmniFaces库添加到构建路径吗?
抱歉,如果这是个愚蠢的问题。谢谢你的解释。
发布于 2016-01-21 14:28:40
转换器实例在通过Application#createConverter()创建的封面之下。
Converter converter = facesContext.getApplication().createConverter(idOrClass);就像JSF中的许多抽象构件一样,Application遵循装潢器(包装)图案,就像您可以找到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;
}
}( https://github.com/omnifaces/omnifaces/blob/2.2/src/main/java/org/omnifaces/application/OmniApplicationFactory.java对于解决来自旧版本的第三方库(如Seam、Weld和Spring )的应用程序工厂来说有点费解(顺便说一句,它们已经被长期固定在一起了)。
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的代表团就在那里。
https://stackoverflow.com/questions/34925732
复制相似问题