Map和JSONObject返回的问题

在进行前后段分离项目的时候,我后端springboot使用JSONObject返回数据,前端ajax请求的时候,方法能走进去,但是每次返回的时候,都报404。可是换了Map返回数据就不会出现错误,有哪位大神可以解答吗?

@ResponseBody
@RequestMapping("/test")
public Map<String, Object> set_new_pwd(HttpServletRequest request)throws Exception {
    Map<String, Object> map = new HashMap<String, Object>();
    String storageNo = request.getParameter("storageNo");
    List<StoragePlan> list = storagePlanDao.findByStorageNo(storageNo);
    if(list.size() <= 0){
        map.put("count",0);
        map.put("success", true);
        return map;
    }else{
        map.put("data",list);
        map.put("count",list.size());
        map.put("success", true);
        return map;
    }
}

这么玄学么。你看看日志,确定是请求的同一个方法?

你看一下后台的404日志。日志中提示,404的路径是什么?都进入Controller方法了,404应该不是当前路径的问题。可能是其他的问题。

例如触发了一些异常,导致执行了异常处理。在渲染模板引擎的时候没找到。也会404。

是同一个,而且网上也有人有类似的错误,但是他们提出的解决办法都是忘记在方法头加上@ResponseBody或者@RestController,但是这些我都加上了。真的很玄学。

都进入了Controller方法,404不会是当前请求造成的。你看一下404的异常日志。提示找不到的路径是什么路径。

你就看一下请求,响应日志。404的时候,系统是去渲染了模板引擎。还是用HttpMessageConverter编码了数据。你把关键的异常复制贴出来看看。

这是jsonObejct的方法出现的错误

这是前端代码

/**
 * /mui_test/test
 */
@ResponseBody
@RequestMapping("/test")
public Map<String, Object> set_new_pwd(HttpServletRequest request)throws Exception {
    //Map<String, Object> map = new HashMap<String, Object>();
    JSONObject result = new JSONObject();
    String storageNo = request.getParameter("storageNo");
    List<StoragePlan> list = storagePlanDao.findByStorageNo(storageNo);
    if(list.size() <= 0){
        result.put("count",0);
        result.put("success", true);
        return result;
    }else{
        result.put("data",list);
        result.put("count",list.size());
        result.put("success", true);
        return result;
    }

}这是后端代码

但是你只要把JsonObject换成Map就不会出错

    @ResponseBody
    @RequestMapping("/test")
    public Map<String, Object> set_new_pwd(HttpServletRequest request)throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String storageNo = request.getParameter("storageNo");
        List<StoragePlan> list = storagePlanDao.findByStorageNo(storageNo);
        if(list.size() <= 0){
            map.put("count",0);
            map.put("success", true);
            return map;
        }else{
            map.put("data",list);
            map.put("count",list.size());
            map.put("success", true);
            return map;
        }

    }

json包:net.sf.json.JSONObject

你发的这堆,看不出来为什么。叫你看后端的日志后端的日志。404的路径是什么。请求,响应的信息。

下面贴出图片了

就是后端不报错啊,后端报错我就有思路了 :joy:

后台没异常?有日志吧。spring这种东西,你404肯定有日志显示

2020-06-03 14:11:27.463 DEBUG 3708 --- [  XNIO-1 task-1] o.s.web.servlet.DispatcherServlet        : GET "/dwwqdq", parameters={}
2020-06-03 14:11:27.469  WARN 3708 --- [  XNIO-1 task-1] o.s.web.servlet.PageNotFound             : No mapping for GET /dwwqdq
2020-06-03 14:11:27.489 DEBUG 3708 --- [  XNIO-1 task-1] .m.m.a.ExceptionHandlerExceptionResolver : Using @ExceptionHandler com.marmot.manager.web.advice.MarmotManagerExceptionAdvice#noHandlerFoundException(HttpServletRequest, HttpServletResponse, NoHandlerFoundException)
2020-06-03 14:11:27.498 ERROR 3708 --- [  XNIO-1 task-1] c.m.c.w.advice.AbstractExceptionAdvice   : org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /dwwqdq

:joy:好吧,代码高亮显示,我以为不是错误,我错了。。。。
后端报错:

2020-06-03 14:16:04.997  WARN 19528 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Object is null; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Object is null (through reference chain: net.sf.json.JSONObject["data"]->net.sf.json.JSONArray[0]->net.sf.json.JSONObject["createDateTime"]->net.sf.json.JSONNull["empty"])]

这是不是说明字段有空的值的时候,不能转换为Json?

:joy: 应该是异常,导致了触发了异常处理器。异常处理器尝试渲染模板引擎。导致的404。
至于 net.sf.json.JSONObject 这东西。我没用过,我一般用 Gson

网上有人说用阿里巴巴的jar包可以解决该问题,没试过,应该可以的吧。不过这问题算是找到答案了

Fastjson经常漏洞。前天又爆出来一个,你还敢用???