我正在开发一个混合了旧版 JSP servlet 代码和较新 JSF 代码的应用程序。我遇到了无法解决的 StackOverlow 错误。有没有人见过或经历过类似的事情,并且可以帮助我在这种类型的混合 JSP/JSF 应用程序上找到正确的方向?
我非常确定 JSF 框架正在尝试在非 JSF 页面上执行某些操作,并且陷入了 JSF 框架内部的递归循环中。我在集群 WebLogic 12.1.3 环境中使用 JSF 2.1.20。我没有在 EAR 或 WAR 文件中捆绑任何 JSF 库,我使用的是所有内容的服务器版本。
我已经进行了大量搜索并发现了其他类似的问题,但到目前为止,没有一个解决方案对我产生任何影响。主要区别似乎是我的错误是相当随机的,并且不会一直发生或在同一位置或同一对象上发生。
我的堆栈跟踪如下...一旦我到达“Caused by”部分,我可以看到相同的行一遍又一遍地重复,表明我的应用程序正在尝试使用 JSF 查找或执行某些操作,但失败了。我没有粘贴整个堆栈跟踪,因为它只是不断重复第 286 行到第 143 行超过 1000 次,直到堆栈最终填满并抛出错误。
2017-07-05 10:06:00,133 [[ACTIVE] ExecuteThread: '11' for queue: 'weblogic.kernel.Default (self-tuning)'] FATAL SecurityFilter Msg=[EVENT FAILURE xxxxxxx -> /SecurityFilter] Error in ESAPI security filter: java.lang.StackOverflowError UserId=xxxxxxx
javax.servlet.ServletException: java.lang.StackOverflowError
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:387)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243)
at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:600)
at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:275)
at myapp.pkg.AcctSummaryAction.perform(AcctSummaryAction.java:158)
at myapp.pkg.DispatcherSec.processRequest(DispatcherSec.java:119)
at myapp.pkg.DispatcherSec.doGet(DispatcherSec.java:130)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at myapp.navigation.JsfRequestFilter.doFilter(JsfRequestFilter.java:187)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at myapp.esapi.filters.SecurityFilter.doFilter(SecurityFilter.java:147)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at myapp.common.MdcFilter.doFilter(MdcFilter.java:68)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at myapp.navigation.DisplayProcessingFilter.doFilter(DisplayProcessingFilter.java:118)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at myapp.common.NoCacheFilter.doFilter(NoCacheFilter.java:68)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3431)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3397)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2280)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2196)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1621)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:256)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: java.lang.StackOverflowError
at javax.faces.context.FacesContext.getCurrentInstance(FacesContext.java:832)
at javax.faces.FactoryFinder$FactoryManagerCache.getApplicationFactoryManager(FactoryFinder.java:715)
at javax.faces.FactoryFinder$FactoryManagerCache.access$100(FactoryFinder.java:690)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:340)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:141)
at com.sun.faces.util.MessageFactory.getApplication(MessageFactory.java:286)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:158)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:136)
at com.sun.faces.util.MessageUtils.getExceptionMessageString(MessageUtils.java:386)
at com.sun.faces.application.ApplicationAssociate.<init>(ApplicationAssociate.java:203)
at com.sun.faces.application.ApplicationImpl.<init>(ApplicationImpl.java:214)
at com.sun.faces.application.ApplicationFactoryImpl.getApplication(ApplicationFactoryImpl.java:107)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:143)
at com.sun.faces.util.MessageFactory.getApplication(MessageFactory.java:286)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:158)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:136)
at com.sun.faces.util.MessageUtils.getExceptionMessageString(MessageUtils.java:386)
at com.sun.faces.application.ApplicationAssociate.<init>(ApplicationAssociate.java:203)
at com.sun.faces.application.ApplicationImpl.<init>(ApplicationImpl.java:214)
at com.sun.faces.application.ApplicationFactoryImpl.getApplication(ApplicationFactoryImpl.java:107)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:143)
at com.sun.faces.util.MessageFactory.getApplication(MessageFactory.java:286)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:158)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:136)
at com.sun.faces.util.MessageUtils.getExceptionMessageString(MessageUtils.java:386)
at com.sun.faces.application.ApplicationAssociate.<init>(ApplicationAssociate.java:203)
at com.sun.faces.application.ApplicationImpl.<init>(ApplicationImpl.java:214)
at com.sun.faces.application.ApplicationFactoryImpl.getApplication(ApplicationFactoryImpl.java:107)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:143)
at com.sun.faces.util.MessageFactory.getApplication(MessageFactory.java:286)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:158)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:136)
at com.sun.faces.util.MessageUtils.getExceptionMessageString(MessageUtils.java:386)
at com.sun.faces.application.ApplicationAssociate.<init>(ApplicationAssociate.java:203)
at com.sun.faces.application.ApplicationImpl.<init>(ApplicationImpl.java:214)
at com.sun.faces.application.ApplicationFactoryImpl.getApplication(ApplicationFactoryImpl.java:107)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:143)
at com.sun.faces.util.MessageFactory.getApplication(MessageFactory.java:286)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:158)
at com.sun.faces.util.MessageFactory.getMessage(MessageFactory.java:136)
at com.sun.faces.util.MessageUtils.getExceptionMessageString(MessageUtils.java:386)
at com.sun.faces.application.ApplicationAssociate.<init>(ApplicationAssociate.java:203)
at com.sun.faces.application.ApplicationImpl.<init>(ApplicationImpl.java:214)
at com.sun.faces.application.ApplicationFactoryImpl.getApplication(ApplicationFactoryImpl.java:107)
...
Etc............ (lines 286 to 107 repeat over and over)
一些我已经研究过但还没有帮助我的事情的例子:
- http://weblogic.sys-con.com/node/43816
- java.lang.StackOverflowError Running JSF 2 example on Weblogic 12c
- https://community.oracle.com/thread/2539035
编辑:我想我已将问题追溯到 weblogic.xml 文件中的设置:“persistent-store-type=replicated_if_clustered”(见下文)。删除此设置后,我无法重现该错误。看来这个应用程序在我的集群中的服务器之间序列化得不太好。内部 WebLogic 日志显示我的应用程序中的随机类存在复制错误。希望它对其他人有帮助。如果我的错误在接下来几天的测试中没有再次出现,我会回来并将其标记为已解决。
<?xml version = '1.0' encoding = 'windows-1252'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.5/weblogic-web-app.xsd"
xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<jsp-descriptor>
<precompile>true</precompile>
</jsp-descriptor>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
<session-descriptor>
<cookie-secure>true</cookie-secure>
<cookie-http-only>true</cookie-http-only>
<!--<persistent-store-type>replicated_if_clustered</persistent-store-type>-->
<url-rewriting-enabled>false</url-rewriting-enabled>
</session-descriptor>
</weblogic-web-app>
编辑2:似乎还存在库冲突。我没有随项目一起发送 JSTL 库和标记库,因为它应该位于服务器上。当我更改部署以包含此 .jar (glassfish.jSTL_1.0.0.0_1-2-2-0.jar) 时,它也使我的许多错误消失,因此我的应用程序一定不会总是找到我认为正在找到的库。
最佳答案
我通过做一些事情解决了这个问题,问题最终是 weblogic 设置和库冲突的组合。完整的详细信息位于原始帖子的编辑中:
- 从 weblogic.xml 中删除了“replicated_if_clustered”设置。
- 将 JSTL 标记库 (glassfish.jSTL_1.0.0.0_1-2-2-0.jar) 与 .war 文件一起打包到服务器。
- 检查了我的其余部署设置,并确保我没有随项目发送任何 JSF、JSP 运行时、ADF 等库,以避免我和服务器之间出现任何其他库冲突。
- 我还特别发现“Resource Bundle Variable Resolver”库默认由 JDeveloper 部署,并且它导致了一些奇怪的库冲突,因此我也将其从我的部署配置文件中删除了。
我在日志文件中没有看到任何更多错误,并且自从包含这些更改以来它一直非常稳定。
关于java - WebLogic 12c 上的 JSF 2 中的 Stackoverflow 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933197/