堆栈溢出 StackOverflowError 排查

发布于:2025-04-19 ⋅ 阅读:(63) ⋅ 点赞:(0)

报错: ex=Handler dispatch failed; nested exception is java.lang.StackOverflowError
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087) ~[spring-webmvc-5.3.34.jar:5.3.34]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.34.jar:5.3.34]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.34.jar:5.3.34]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.34.jar:5.3.34]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:497) ~[jakarta.servlet-api-4.0.4.jar:4.0.4]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.34.jar:5.3.34]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) ~[jakarta.servlet-api-4.0.4.jar:4.0.4]

只看上述报错,看不出来原因,很迷茫,看报错的最后部分

at cn.hutool.json.JSONObject.set(JSONObject.java:393) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.json.JSONObject.set(JSONObject.java:352) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.json.JSONObject.put(JSONObject.java:340) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.json.JSONObject.put(JSONObject.java:32) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.core.bean.copier.BeanToMapCopier.lambda$copy$0(BeanToMapCopier.java:82) ~[hutool-all-5.8.26.jar!/:5.8.26]
at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[na:1.8.0_412]
at cn.hutool.core.bean.copier.BeanToMapCopier.copy(BeanToMapCopier.java:48) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.core.bean.copier.BeanToMapCopier.copy(BeanToMapCopier.java:16) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.core.bean.copier.BeanCopier.copy(BeanCopier.java:92) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.core.bean.BeanUtil.beanToMap(BeanUtil.java:725) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.json.ObjectMapper.mapFromBean(ObjectMapper.java:264) ~[hutool-all-5.8.26.jar!/:5.8.26]
at cn.hutool.json.ObjectMapper.map(ObjectMapper.java:114) ~[hutool-all-5.8.26.jar!/:5.8.26]

是hutool工具的转换报错,检查代码

    private void getBodyParam(Object arg, Map<String, Object> returnMap) {
        Map<String, Object> paramMap = new HashMap<>();
        boolean isJson = false;
        try {
            paramMap = JSONUtil.toBean(JSONUtil.toJsonStr(arg), Map.class);
            isJson = true;
        } catch (Exception e) {
            log.debug("非json格式");
        }

转换 Object arg 到 Map<String, Object> paramMap 时,使用 JSONUtil.toBean 导致的循环溢出

解决方案:寻找更有的 json 转换工具

     private void getBodyParam(Object arg, Map<String, Object> returnMap) {
        Map<String, Object> paramMap = new HashMap<>();
        boolean isJson = false;
        try {

            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            String jsonStr = mapper.writeValueAsString(arg);
            paramMap = mapper.readValue(jsonStr, new TypeReference<Map<String, Object>>() {});
            isJson = true;
        } catch (Exception e) {
            log.debug("非json格式");
        }

网站公告

今日签到

点亮在社区的每一天
去签到