Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP状态500-处理程序处理失败;嵌套的异常是java.lang.StackOverflowerr_Java_Gson_Stack Overflow - Fatal编程技术网

HTTP状态500-处理程序处理失败;嵌套的异常是java.lang.StackOverflowerr

HTTP状态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

我在运行webportal一段时间后出现以下异常。我需要重新登录以消除此错误。因此,我无法在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 {

    }

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

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;