【问题标题】:HTTP Status 500 - Handler processing failed; nested exception is java.lang.StackOverflowErrorHTTP 状态 500 - 处理程序处理失败;嵌套异常是 java.lang.StackOverflowError
【发布时间】:2017-05-24 20:14:13
【问题描述】:

在运行我的门户网站一段时间后,我得到了以下异常。我需要重新登录才能消除此错误。因此,我无法在 Eclipse 上顺利运行我的开发环境。

这是我的 AuthenticationFilter.java

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 {

    }

}

我得到的异常

type Exception report

message Handler processing failed; nested exception is java.lang.StackOverflowError

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.StackOverflowError
    org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1276)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:958)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    net.codejava.spring.AuthenticationFilter.doFilter(AuthenticationFilter.java:52)
root cause

java.lang.StackOverflowError
    com.google.gson.stream.JsonWriter.beforeName(JsonWriter.java:586)
    com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:401)
    com.google.gson.stream.JsonWriter.value(JsonWriter.java:417)
    com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:362)
    com.google.gson.internal.bind.TypeAdapters$13.write(TypeAdapters.java:346)
    com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
    com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
    com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
    com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)

编辑 我已经确定了根本原因。

response = new Gson().toJson(invException);

类型

InvalidObjectStateException invException

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;
    }
}

我在这里做错了什么?为什么 Gson 不能解析异常?

【问题讨论】:

  • 在第 52 行,您从 doFilter 调用 doFilter,但在某些时候,由于递归,您的堆栈帧空间不足。
  • 我正在调用 chain.doFilter(2parameters) 而我的方法是 3 个参数。这不是根本原因。
  • 你在 catch 块之后和第 52 行有 chain.doFilter(request, response);。这两个语句都有 2 个具有相同对象的参数
  • 你的 是什么样子的?

标签: java gson stack-overflow


【解决方案1】:

Object exceptionCausingObject中的问题

它有循环引用,所以 Gson 解析器无法正确解析它并抛出 StackOverflowError

可以将exceptionCausingObject类的部分字段标记为transient

private transient String name;

这会将它们从 Gson 序列化中排除。

另一种选择是使用GraphAdapterBuilder。见here

【讨论】:

  • 我检查了,在异常发生时exceptionCausingObject 为空。
【解决方案2】:

我认为这不是正确的异常来源。 net.codejava.spring.AuthenticationFilter.doFilter(AuthenticationFilter.java:52)。由于内存不足,它只是在此位置失败。

应该有另一个进程/请求正在转换response(maybe)/object to json string。查看response 对象,它应该有一个嵌套的无限对象引用。

【讨论】:

  • 好的,是的,这听起来是正确的。响应对象可能有一个循环引用。我会调查并报告
  • 我找到了根本原因。不知道这是否有助于您更好地回答它
  • 不是真的!您需要找出对象类型在这个异常类中 - Object exceptionCausingObject。可能在创建对象时记录类名。
  • 在异常中看到Logger 有点苦恼。也许记录器的实现引用了InvalidObjectStateExceptionclass(它引用了记录器)-> 循环引用。一个简单的解决方法是更改​​异常的 json 序列化(可能只是编组消息和堆栈跟踪)
猜你喜欢
  • 2017-11-30
  • 2015-03-08
  • 2014-06-30
  • 2016-12-12
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多