汪的爱琪 2023-08-28 12:15 采纳率: 67.5%
浏览 9
已结题

SSM框架返回stream的json报406错误

这是我遇到的错误

img


这是我写的Controller层代码(可以实现遍历文件系统的文件名称,并将其转换为Stream流返回)

package com.experience.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Arrays;
import java.util.stream.Stream;

/**
 * @author 汪海洋
 */
@Controller
public class File_download_list_Controller {//TODO 换成数据库维护
    @RequestMapping( "getFileList")//BETTER 值得更好的
    @ResponseBody
    public Stream<String> getFileList(HttpServletRequest request){
       String filePath = request.getServletContext().getRealPath("/save");
        File file = new File(filePath);
        if (file.exists()){
            Stream<String> stream = Arrays.stream(file.list()).toList().stream();
            stream.forEach(n -> System.out.println(n));
            return stream;
        }
        System.out.println("错误!");
        return null;
    }
}

这是我写的前端页面,用来将返回的json输出到控制台


<%--
  Created by IntelliJ IDEA.
  User: 汪海洋
  Date: 2023/8/13
  Time: 9:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>下载页面</title>
</head>
<body>
  <form action="/download" method="post">
      <input type="text" name="fileName" />
    <input type="submit" value="下载"/>
  </form>
</body>
<script type="text/javascript">
    window.onload = function () {
        var xhr = new XMLHttpRequest();
        xhr.open("get","/getFileList",true)
        xhr.send();
        xhr.onreadystatechange = function (response) {
            if (xhr.status === 200 && xhr.readyState === 4){
                let data = JSON.parse(xhr.responseText);
                console.log(data);
            }
        }
    }
</script>
</html>


  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-08-28 12:30
    关注

    引用 皆我百晓生 小程序回复内容作答:

    根据你提供的代码和错误截图看,你遇到的问题是返回的JSON报406错误。

    这个错误的原因是因为浏览器不支持返回的JSON数据类型。在SpringMVC中,默认情况下,它使用MappingJackson2HttpMessageConverter来将Java对象转换为JSON格式的响应。

    可以尝试以下解决方法:

    1. 确保你的项目中已经引入了Jackson库的依赖,比如jackson-databind。

    2. 在Controller方法上加上produces属性,指定返回的媒体类型为application/json。

      @RequestMapping(value = "/getFileList", produces = "application/json")
      

      或者在类的上面加上@RequestMapping注解,指定所有方法的媒体类型为application/json。

      @RequestMapping(produces = "application/json")
      
    3. 修改前端页面的javascript部分,在xhr.open方法中添加请求头Accept为application/json。

      xhr.open("get", "/getFileList", true);
      xhr.setRequestHeader("Accept", "application/json");
      

      这样可以确保浏览器能够正确处理返回的JSON数据。

    希望以上解决方法能够帮助你解决问题。如果还有其他疑问,请随时追问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 创建了问题 8月28日

悬赏问题

  • ¥15 有人会用py或者r画这种图吗
  • ¥15 MOD04_3K图像预处理
  • ¥15 [VASP]关于超胞大小和k 点网格的收敛性测试
  • ¥15 pip下载paddle2onnx离谱错误
  • ¥60 db2move nlzxams import 导出db2备份数据报错
  • ¥15 关于#python#的问题:全文总结功能咨询
  • ¥15 俄罗斯方块中无法同时消除多个满行
  • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
  • ¥15 psfusion图像融合指标很低
  • ¥15 银河麒麟linux系统如何修改/etc/hosts权限为777