Seam / Spring WebFlow 应用程序中的 StackOverflowError

2024-02-09

我们正在逐步用 Spring-MVC 和 Spring-Webflow 替换 Seam 组件。

运行 JMeter 测试几个小时后,日志会因 StackOverFlowErrors 变得混乱:

javax.servlet.ServletException: Servlet execution threw an exception
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:341)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:530)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
...
Caused by: java.lang.StackOverflowError
    at org.jboss.seam.jsf.SeamApplication.getMessageBundle(SeamApplication.java:264)
    at org.springframework.faces.webflow.FlowApplication.getMessageBundle(FlowApplication.java:214)
    at org.jboss.seam.jsf.SeamApplication.getMessageBundle(SeamApplication.java:264)
    at org.springframework.faces.webflow.FlowApplication.getMessageBundle(FlowApplication.java:214)
    at org.jboss.seam.jsf.SeamApplication.getMessageBundle(SeamApplication.java:264)
    at org.springframework.faces.webflow.FlowApplication.getMessageBundle(FlowApplication.java:214)
    at org.jboss.seam.jsf.SeamApplication.getMessageBundle(SeamApplication.java:264)

因此 getMessageBundle 方法由两个实例调用:SeamApplication 和 FlowApplication。

查看 javax.faces.application.Application 类,它显示:

“因为这个实例是共享的,所以必须以线程安全的方式实现。”

也许这两个应用程序实例正在尝试访问同一个包,这会导致竞争条件?

编辑: 应用程序不再响应后,我们重新启动服务器,现在错误出现在另一个地方:

Caused by: java.lang.StackOverflowError
at org.jboss.seam.contexts.BasicContext.get(BasicContext.java:49)
at org.jboss.seam.contexts.BasicContext.get(BasicContext.java:44)
at org.jboss.seam.core.Init.instance(Init.java:117)
at org.jboss.seam.jsf.SeamApplication$ConverterLocator.<init>(SeamApplication.java:140)
at org.jboss.seam.jsf.SeamApplication.createConverter(SeamApplication.java:122)
at org.springframework.faces.webflow.FlowApplication.createConverter(FlowApplication.java:161)
at org.jboss.seam.jsf.SeamApplication.createConverter(SeamApplication.java:126)
at org.springframework.faces.webflow.FlowApplication.createConverter(FlowApplication.java:161)
at org.jboss.seam.jsf.SeamApplication.createConverter(SeamApplication.java:126)

最后两行在日志文件中重复了数千次。

我们正在使用以下组件版本:

JSF-1.2

Seam-2.2.0

Spring WebFlow 2.3.4

春季MVC 3.0.5

更新任何组件都不是一个选择。


这俩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交换代码)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Seam / Spring WebFlow 应用程序中的 StackOverflowError 的相关文章

随机推荐

  • 解决方法:汇总下游测试结果

    据我所知 聚合下游测试结果 功能并没有按预期工作 并且很难找到有用的文档 我想实现非常相似的功能 Job Build触发工作T1 T2并行 其中T1FindBugs T2PMD 场景一 立刻T1 and T2已完成 我可以使用 加入 插件来
  • 如何使用参数传递对函数的引用? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 JavaScript 函数调用中预先设置参数 部分功能应用 https stackoverflow com questions 321113 how can i pre set argumen
  • 微服务依赖管理 - 治理还是领域驱动设计?

    背景 由于长期的单体式痛苦 一家采用联邦模式的国际公司正在转型为微服务 能够快速部署的自治团队是非常理想的 尽管理论上如此 但服务确实相互依赖以获得更高的功能 但它们是自治的 独立开发和部署 由于这是联邦模式和分散控制 我们不能像联合国那样
  • Java 安全管理器会降低性能吗?

    实施 Java 安全管理器是否会导致性能下降 这完全取决于实现的细节以及应用程序 当然有可能实现一个需要很长时间来检查某些权限的安全管理器 以及一个需要非常频繁地检查这些权限的应用程序 从而导致可怕的性能 但通常情况下 检查权限的频率不足以
  • 在 Firebase 数据库模拟器中模拟更新

    我的问题很简单 我不知道如何在 Firebase Simulator 中模拟多个更新 由于我什至不知道如何开始 所以我无法提供任何代码 任何指导都会非常有帮助 目前无法在 Firebase 数据库安全规则模拟器中执行多位置更新 拥有该功能就
  • OS X 上的 ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:747)

    我正在尝试这段代码 import pandas as pd fiddy states pd read html https simple wikipedia org wiki List of U S states print fiddy s
  • 所有编译时常量都是内联的吗?

    假设我有一堂这样的课 class ApplicationDefs public static final String configOption1 some option public static final String configO
  • 使用 django 和 xgettext 进行本地化

    我正在翻译我的网站 但是当我尝试运行命令时 manage py makemessages locale bs 我不断收到如下错误 CommandError errors happened while running xgettext on
  • 将图像添加到 pandas DataFrame

    假设我有一个 DataFrame 我想导出为 PDF 在数据框中 我有以下列 代码 名称 价格 净值 销售额 每一行都是一个产品 我想向该 DataFrame 中的每个产品添加一个我可以使用 BeautifulSoup 获得的图像 有什么方
  • 网页设计:“向下滚动导航”

    某些网络应用程序中使用的技术是什么 例如http www alfredapp com http www alfredapp com导航在哪里向下滚动网站以显示另一个网站 为了获得这种导航方式 我会将所有内容放在一个页面上并使用 平滑滚动效果
  • Spark sql字符串到时间戳缺少毫秒

    Why is import spark implicits val content Seq 2019 09 11 17 16 54 762000000 toDF year month day hour minute second nano
  • 如何使用 Google 协作平台中嵌入的网络应用程序链接到另一个页面?

    单击新页面的链接后 从用户的角度来看 什么也没有发生 控制台打印出如下错误 不安全的 JavaScript 尝试启动具有原点的框架导航 来自带有 URL 的框架的 https sites google com https n frzjyfh
  • JQuery DatePicker 只读

    当我将日期选择器设置为只读时 我发现用户无法在文本框中输入任何内容 datepicker attr readonly readonly 但是 他们仍然可以使用日历更改该值 如何隐藏日历以使用户无法更改日期值 我不想禁用日期选择器 因为我需要
  • Travis CI:构建矩阵项中的分支过滤器

    我们想知道是否有任何方法可以向 Travis 矩阵项添加过滤器 在我们的特定情况下 我们希望仅在特定分支上运行某些作业 以下示例是配置此场景的理想方法 但它似乎不起作用 matrix include env BUILD TYPE relea
  • 超正方体的替代方案

    Python 或 OpenCV 中是否有替代软件或任何库可以替代 Tesseract 进行字符识别 有什么建议的可以用Python实现的字符识别方法吗 Thanks This site https github com kba awesom
  • Clojure 形式到字符串

    有没有办法将 Clojure 形式转换为字符串 例如 转变 and f 1 g 3 to and f 1 g 3 gt defmacro string it x str x user string it gt string it 1 2 1
  • 在Matlab中循环多个文件

    我需要让 Matlab R2013a 在目录中查找包含 txt 扩展名的所有文件 然后对这些文件执行某些数学表达式 之后 脚本必须打印出与输入文件同名的文件中的数据 除了添加一些新单词以便我可以区分之外 例如 Input file1 txt
  • Java 框架中的单页 Web 应用程序或示例? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有人看过 Java 中的示例或执行过以下操作 http duganchen ca single page web app archit
  • 如何计算两个给定日期之间的月数(基线和后续日期)

    我正在尝试确定基线和随访之间的月数 我的约会看起来像这样 Baseline Follow Up 10 6 15 10 10 17 10 6 15 4 20 18 10 6 15 4 18 18 10 6 15 7 2 18 10 6 15
  • Seam / Spring WebFlow 应用程序中的 StackOverflowError

    我们正在逐步用 Spring MVC 和 Spring Webflow 替换 Seam 组件 运行 JMeter 测试几个小时后 日志会因 StackOverFlowErrors 变得混乱 javax servlet ServletExce