ServletException java.lang.StackOverflowerError有时与多个doGet()调用一起抛出-Weblogic 10

ServletException java.lang.StackOverflowerError有时与多个doGet()调用一起抛出-Weblogic 10,java,stack-overflow,weblogic-10.x,Java,Stack Overflow,Weblogic 10.x,我们有一个在WebLogic10服务器上运行的应用程序。在浏览此应用程序时,用户有时会随机获得以下异常跟踪。 代码基于servlet/jsp框架。所有代码都将进入controller.java,然后是BAsisServlet.java,然后是相应的Servlet。 我们无法识别导致此错误的特定流。这是非常随机的。在本地系统中,我们永远无法复制相同的数据。 在其他一些帖子中,我看到“/*”可能会导致堆栈溢出问题,但让我困惑的是,为什么它只是偶尔出现。任何有关该问题的意见都将不胜感激

我们有一个在WebLogic10服务器上运行的应用程序。在浏览此应用程序时,用户有时会随机获得以下异常跟踪。 代码基于servlet/jsp框架。所有代码都将进入controller.java,然后是BAsisServlet.java,然后是相应的Servlet。 我们无法识别导致此错误的特定流。这是非常随机的。在本地系统中,我们永远无法复制相同的数据。 在其他一些帖子中,我看到“/*”可能会导致堆栈溢出问题,但让我困惑的是,为什么它只是偶尔出现。任何有关该问题的意见都将不胜感激

                    <[weblogic.servle
                    t.internal.WebAppServletContext@375e95f - appName: 'ebasis', name: '/', context-
                    path: ''] Root cause of ServletException.
                    java.lang.StackOverflowError
                            at weblogic.utils.StringUtils.getString(StringUtils.java:556)
                            at weblogic.utils.http.BytesToString.newString(BytesToString.java:14)
                            at weblogic.utils.http.BytesToString.newString(BytesToString.java:10)
                            at weblogic.servlet.internal.RequestHeaders.getHeaderValue(RequestHeader
                    s.java:82)
                    at weblogic.servlet.internal.RequestHeaders.getHeader(RequestHeaders.java:41)
                            at weblogic.servlet.internal.ServletRequestImpl.getHeader(Unknown Source)
                            at com.ba.basis.servlet.BasisServlet.isLoggedOnUserValid(BasisServlet.java:1749)
                            at com.ba.basis.servlet.Controller.doPost(Controller.java:293)
                            at com.ba.basis.servlet.Controller.doGet(Controller.java:72)
                            at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
                            at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
                            at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
                            at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
                            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
                            at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
                            at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:525)
                           at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:261)
                        at com.ba.basis.servlet.Controller.doPost(Controller.java:658)
                        at com.ba.basis.servlet.Controller.doGet(Controller.java:72)
                        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
                        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
                        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
                        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
                        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
                        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
                        at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:525)
                        at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:261)
                        at com.ba.basis.servlet.Controller.doPost(Controller.java:658)
                        at com.ba.basis.servlet.Controller.doGet(Controller.java:72)
Controller.java

protected void processHttpRequest(HttpServletRequest request,
                HttpServletResponse response ) throws ServletException, IOException {
            // set up the no-cache part of the response

            response.setHeader("Cache-Control", "no-cache");
            response.setHeader("Pragma", "no-cache");
            response.setIntHeader("Expires", 0);

            DisplayValueBean displayValueBean = (DisplayValueBean)request.getAttribute(ServletDefines.DISPLAYVALUEBEAN);
        //  HttpSession session;
            String methodIdentifier = "doPost";
            String methodToExecute = new String();
            com.ba.basis.util.NavState nav;
            //Find the method required to be called from the user's NavState
            //object held in the session
            try {
                session.getAttribute(ServletDefines.NAVIGATION_STATE);
                nav = (com.ba.basis.util.NavState) displayValueBean.getNavState();
                methodToExecute = nav.getServletMethodName();

            } catch (NullPointerException npe) {
                log(classIdentifier, methodIdentifier,
                        "eBASIS-2-100004", null, npe, request, response);
            }
            /* Call required method by Introspection */
            try {
                Class c = this.getClass();
                //Create a class of correct type to inspect for method names
                //Create array of parameter types consistent with method signature.
                //All methods called in this way have 'request' and 'response'
                // passed in.
                Class paramtypes[];
                java.lang.reflect.Method m;
                Object arglist[];
                if( (methodToExecute != null) && methodToExecute.equalsIgnoreCase("removeSystemFilter")){               
                    paramtypes = new Class[3];
                    paramtypes[0] = Class
                            .forName("javax.servlet.http.HttpServletRequest");
                    paramtypes[1] = Class
                            .forName("javax.servlet.http.HttpServletResponse");
                    paramtypes[2] = Class
                            .forName("com.ba.basis.servlet.DisplayValueBean");

                    m = c.getDeclaredMethod(methodToExecute,
                            paramtypes);
//Create array of arguments to be passed into method
                    arglist = new Object[3];
                    arglist[0] = request;
                    arglist[1] = response;
                    arglist[2] = displayValueBean;
                    request.setAttribute(ServletDefines.DISPLAYVALUEBEAN, displayValueBean);
                }else{

                 paramtypes = new Class[2];
                paramtypes[0] = Class
                        .forName("javax.servlet.http.HttpServletRequest");
                paramtypes[1] = Class
                        .forName("javax.servlet.http.HttpServletResponse");
                //Find named method with defined signature
                 m = c.getDeclaredMethod(methodToExecute,
                        paramtypes);
                //Create array of arguments to be passed into method
                 arglist = new Object[2];
    //          System.out.println("Before entering Line 1167 in Basis Servlet TM :: "+Runtime.getRuntime().totalMemory()+" FM:: "+Runtime.getRuntime().freeMemory());
                arglist[0] = request;
    //          System.out.println("After entering Line 1167 in Basis Servlet TM :: "+Runtime.getRuntime().totalMemory()+" FM:: "+Runtime.getRuntime().freeMemory());
                arglist[1] = response;
    //          System.out.println("After entering Line 1168 in Basis Servlet TM :: "+Runtime.getRuntime().totalMemory()+" FM:: "+Runtime.getRuntime().freeMemory());
                request.setAttribute(ServletDefines.DISPLAYVALUEBEAN, displayValueBean);
                }
                //long beforeMethodCall = System.currentTimeMillis();
                //Invoke method on this instance of the class, passing in desired
                // arguments
                m.invoke(this, arglist);
                //long afterMethodCall = System.currentTimeMillis();
    //          Log.write("Time to execute method :: "+m+" of class :: "+c+" within BasisServlet's processHttpRequest is :: "+(afterMethodCall - beforeMethodCall)+" ms");
            } catch (java.lang.reflect.InvocationTargetException ite) {
                log(classIdentifier, methodIdentifier,
                        "eBASIS-3-100005", null, ite, request, response);
            } catch (NoSuchMethodException nsme) {
                log(classIdentifier, methodIdentifier,
                        "eBASIS-2-100006", "Method called= " + methodToExecute,
                        nsme, request, response);
            } catch (Exception e) {
                log(classIdentifier, methodIdentifier,
                        "eBASIS-2-100007", null, e, request, response);
            }
        }

如果不访问代码和不知道用户输入,很难调查StackOverflowException等运行时异常的原因。特别是如果随机出现错误。尤其是在您发布时方法调用的动态性质的情况下

我不相信,在部署描述器中指定“/*”模式会导致此类随机问题

我只能建议检查(堆栈跟踪实际所说的)业务逻辑(从doGet()调用doPost()的原因以及重定向的原因和点):

也许这种方法也是一种很好的检查方法:

at com.ba.basis.servlet.BasisServlet.isLoggedOnUserValid(BasisServlet.java:1749)
顺便说一句,将反射相关代码更改为:

paramtypes = new Class[] {HttpServletRequest.class, HttpServletResponse.class, DisplayValueBean.class};
m = c.getDeclaredMethod(methodToExecute, paramtypes);
//Create array of arguments to be passed into method
arglist = new Object[] {request, response, displayValueBean};

你能发布你的
BasisServlet.java
Controller.java
吗?我正在发布在点击url.COntent时访问的方法,这些方法用BasisServlet和Controller方法更新
at com.ba.basis.servlet.Controller.doPost(Controller.java:658)
at com.ba.basis.servlet.Controller.doGet(Controller.java:72)
at com.ba.basis.servlet.BasisServlet.isLoggedOnUserValid(BasisServlet.java:1749)
paramtypes = new Class[] {HttpServletRequest.class, HttpServletResponse.class, DisplayValueBean.class};
m = c.getDeclaredMethod(methodToExecute, paramtypes);
//Create array of arguments to be passed into method
arglist = new Object[] {request, response, displayValueBean};