无论是
SeamApplication和
FlowApplication有缺陷的正确委派到包装中的应用。解决它的一种方法是通过
FlowApplicationFactory。
首先,获取其原始源代码并将其放入webapp项目的Java源文件夹中,并保持其原始包。您不一定需要操纵JAR。中的类的
/WEB-INF/classes加载优先级高于JAR中的类。
然后按如下方式操作该类(基于OmniFaces
OmniApplicationFactory):
public class FlowApplicationFactory extends ApplicationFactory { private final ApplicationFactory wrapped; private volatile Application application; public FlowApplicationFactory(ApplicationFactory wrapped) { this.wrapped = wrapped; } @Override public Application getApplication() { return (application == null) ? createFlowApplication(wrapped.getApplication()) : application; } @Override public synchronized void setApplication(Application application) { wrapped.setApplication(createFlowApplication(application)); } private Application createFlowApplication(final Application application) { Application newApplication = application; while (!(newApplication instanceof FlowApplication) && newApplication instanceof SeamApplication) { newApplication = ((SeamApplication) application).getDelegate(); } if (!(newApplication instanceof FlowApplication)) { newApplication = new FlowApplication(application); } return (this.application = newApplication); }}因此,在创建时
FlowApplication,它将首先检查已包装的应用程序,如果之前尚未创建,则将其重新使用。
请注意,该
SeamApplication依赖项很尴尬,但这只是为了修正它。JSF2通过新
ApplicationWrapper类使您变得更轻松,您可以使用它而不是
SeamApplication在
createFlowApplication()块中使用。
如果这一切仍然无法正常工作,那么也许
SeamApplicationFactory初始化 后
的
FlowApplicationFactory。您可以通过按期望的顺序显式地重新声明
<application-factory>webapp自身
faces-config.xml中的条目来强制排序(错误修正为最后一个):
<factory> <application-factory>org.jboss.seam.jsf.SeamApplicationFactory</application-factory> <application-factory>org.springframework.faces.webflow.FlowApplicationFactory</application-factory></factory>
否则,您可能想要执行与上述相同的操作
SeamApplicationFactory(显然是在代码中
FlowApplication与
SeamApplication交换)。



