这俩SeamApplication http://grepcode.com/file/repository.jboss.org/nexus/content/repositories/releases/org.jboss.seam/jboss-seam/2.2.0.GA/org/jboss/seam/jsf/SeamApplication.java#SeamApplication and FlowApplication http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.webflow/spring-faces/2.3.4.RELEASE/org/springframework/faces/webflow/FlowApplication.java#FlowApplication在正确委托给包装的应用程序方面存在错误。修复它的一种方法是通过FlowApplicationFactory http://grepcode.com/file/repo1.maven.org/maven2/org.springframework.webflow/spring-faces/2.3.4.RELEASE/org/springframework/faces/webflow/FlowApplicationFactory.java#FlowApplicationFactory.
首先抓住它的原始源代码 http://grepcode.com/file_/repo1.maven.org/maven2/org.springframework.webflow/spring-faces/2.3.4.RELEASE/org/springframework/faces/webflow/FlowApplicationFactory.java/?v=source并将其放入 webapp 项目的 Java 源文件夹中,保留其原始包。您不一定需要操作 JAR。课程于/WEB-INF/classes
比 JAR 中的类加载优先级更高。
然后按如下方式操作该类(基于OmniFaces http://omnifaces.org OmniApplicationFactory https://github.com/omnifaces/omnifaces/blob/master/src/main/java/org/omnifaces/application/OmniApplicationFactory.java):
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 http://docs.oracle.com/javaee/7/api/javax/faces/application/ApplicationWrapper.html你可以使用的类来代替SeamApplication
in the createFlowApplication()
block.
如果这一切仍然不起作用,那么也许SeamApplicationFactory
已初始化after the 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 http://grepcode.com/file/repository.jboss.org/nexus/content/repositories/releases/org.jboss.seam/jboss-seam/2.2.0.GA/org/jboss/seam/jsf/SeamApplicationFactory.java#SeamApplicationFactory(显然与FlowApplication
and SeamApplication
交换代码)。