HTTP状态500-处理程序处理失败;嵌套的异常是java.lang.StackOverflowerr
我在运行webportal一段时间后出现以下异常。我需要重新登录以消除此错误。因此,我无法在eclipse上顺利运行我的开发环境 这是我的AuthenticationFilter.javaHTTP状态500-处理程序处理失败;嵌套的异常是java.lang.StackOverflowerr,java,gson,stack-overflow,Java,Gson,Stack Overflow,我在运行webportal一段时间后出现以下异常。我需要重新登录以消除此错误。因此,我无法在eclipse上顺利运行我的开发环境 这是我的AuthenticationFilter.java public class AuthenticationFilter implements Filter { private static final Logger log = Logger.getLogger(AuthenticationFilter.class) ; static Map&l
public class AuthenticationFilter implements Filter {
private static final Logger log = Logger.getLogger(AuthenticationFilter.class) ;
static Map<String, String> permissionsMapping = new HashMap<String, String>();
private static int domainOrGroupParentId = 0;
static {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
if (servletRequest.getRequestURI().contains("onLoadOfLoginPage")
|| servletRequest.getRequestURI().contains("Corporate")
|| servletRequest.getRequestURI().contains("mainDashboard")
// ||
// servletRequest.getRequestURI().contains("mainDashboardWithoutDomainOrGroupParent")
|| servletRequest.getRequestURI().contains("loginButtonPressedForSuperAdminView")
// ||
// servletRequest.getRequestURI().contains("loginButtonPressedForNonSuperAdmin")
|| servletRequest.getRequestURI().contains("resources")
|| servletRequest.getRequestURI().contains("session")
|| servletRequest.getRequestURI().contains("forgot_password")
|| servletRequest.getRequestURI().contains("resetPassword")) {
>>Line52>> chain.doFilter(request, response);
} else {
HttpSession session = servletRequest.getSession(false);
try {
if (null == session || SessionDataManager.getInstance().getLoggedInWebAdminUser().getWebAdminUserPojo()
.getUsername() == null) {
RequestDispatcher dispatcher = request.getRequestDispatcher("onLoadOfLoginPage");
dispatcher.forward(request, response);
return;
} else if (!servletRequest.getRequestURI().contains("get")) {
String username = (String) SessionDataManager.getInstance().getLoggedInWebAdminUser()
.getWebAdminUserPojo().getUsername();
String sessionID = session.getId();
domainOrGroupParentId = SessionDataManager.getInstance().getDomainIdFromRequest(servletRequest);
log.info("Attempting to maintain Session, with domainParent "+domainOrGroupParentId);
if (!WebAdminHelper.maintainSession(username, sessionID, domainOrGroupParentId)) {
RequestDispatcher dispatcher = request.getRequestDispatcher("onLoadOfLoginPage");
dispatcher.forward(request, response);
return;
}
}
} catch (Exception e) {
}
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
编辑
我已经确定了根本原因
response=new Gson().toJson(invException)
类型
InvalidObjectStateException invException
我做错了什么?为什么Gson不能解析异常?我认为这不是异常的正确来源
net.codejava.spring.AuthenticationFilter.doFilter(AuthenticationFilter.java:52)
。由于内存不足,它在该位置失败
应该有另一个进程/请求正在将
响应(可能)/对象转换为json字符串。查看响应
对象,它应该有一个嵌套的无限对象引用。对象异常CausingObject中的问题
它具有循环引用,因此Gson解析器无法正确解析它并抛出StackOverflowerError
您可以将异常causingobject
类的某些字段标记为瞬态
private transient String name;
这将从Gson序列化中排除它们
另一个选项是使用
GraphAdapterBuilder
。参见在第52行,您从doFilter调用doFilter,在某个时刻,由于递归,堆栈帧的空间不足。我调用chain.doFilter(2个参数),我的方法是3个参数。这不是根本原因。您有chain.doFilter(请求、响应)代码>在挡块后和第52行。这两个语句都有两个参数,它们具有相同的对象。您的对象看起来像什么?好的,是的,听起来是正确的。响应对象可能具有循环引用。。我会调查此事并报告我已经找到了根本原因。。我想知道这是否有助于你更好地回答这个问题!您需要找出对象类型在此异常类-object exceptionCausingObject中。可能在创建对象时记录类名。在异常中看到记录器
,我有点难过。可能记录器的实现引用了InvalidObjectStateException
类(它引用了记录器)->循环引用。一个简单的修复方法是更改我检查的异常的json序列化(可能只有marshall message&stacktrace),在异常发生时exceptionCausingObject
为空。
public class InvalidObjectStateException extends Exception {
private static final long serialVersionUID = -9086960433236073019L;
private static final Logger log = Logger.getLogger(InvalidObjectStateException.class);
private String customErrorMessage = null;
private Object exceptionCausingObject = null;
public InvalidObjectStateException(String errorMessage, Object exceptionCausingObject) {
super(errorMessage);
this.customErrorMessage = errorMessage;
log.info("InvalidObjectStateException : exceptionCausingObject"
+ ((exceptionCausingObject != null) ? exceptionCausingObject.getClass().toString() : ""));
this.exceptionCausingObject = exceptionCausingObject;
}
public String getCustomErrorMessage() {
return customErrorMessage;
}
public void setCustomErrorMessage(String customErrorMessage) {
this.customErrorMessage = customErrorMessage;
}
public Object getExceptionCausingObject() {
return exceptionCausingObject;
}
public void setExceptionCausingObject(Object exceptionCausingObject) {
this.exceptionCausingObject = exceptionCausingObject;
}
}
private transient String name;