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