这是我遇到的错误
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>
引用 皆我百晓生 小程序回复内容作答:
根据你提供的代码和错误截图看,你遇到的问题是返回的JSON报406错误。
这个错误的原因是因为浏览器不支持返回的JSON数据类型。在SpringMVC中,默认情况下,它使用MappingJackson2HttpMessageConverter来将Java对象转换为JSON格式的响应。
可以尝试以下解决方法:
确保你的项目中已经引入了Jackson库的依赖,比如jackson-databind。
在Controller方法上加上produces属性,指定返回的媒体类型为application/json。
@RequestMapping(value = "/getFileList", produces = "application/json")
或者在类的上面加上@RequestMapping注解,指定所有方法的媒体类型为application/json。
@RequestMapping(produces = "application/json")
修改前端页面的javascript部分,在xhr.open方法中添加请求头Accept为application/json。
xhr.open("get", "/getFileList", true);
xhr.setRequestHeader("Accept", "application/json");
这样可以确保浏览器能够正确处理返回的JSON数据。
希望以上解决方法能够帮助你解决问题。如果还有其他疑问,请随时追问。
【以下回答由 GPT 生成】
首先,406错误表示客户端请求的数据格式不被服务器支持。在这种情况下,你的Controller返回了一个Stream<String>
对象作为响应体,但是Spring MVC默认使用MappingJackson2HttpMessageConverter
来处理响应,并将其转换为JSON格式。但是,MappingJackson2HttpMessageConverter
不支持将Stream
对象直接转换为JSON。
为了解决这个问题,你可以通过做以下更改来优化你的代码:
Stream<String>
改为List<String>
。这样,可以使用ArrayList
或其他实现List
接口的类来存储文件名列表。public List<String> getFileList(HttpServletRequest request) {
String filePath = request.getServletContext().getRealPath("/save");
File file = new File(filePath);
if (file.exists()) {
List<String> fileList = Arrays.asList(file.list());
fileList.forEach(System.out::println);
return fileList;
}
System.out.println("错误!");
return Collections.emptyList();
}
produces
属性,指定响应的媒体类型为application/json
。@RequestMapping(value = "getFileList", produces = "application/json")
@ResponseBody
public List<String> getFileList(HttpServletRequest request) {
//...
}
fetch
或其他ajax请求库来获取JSON数据,并将返回的数据输出到控制台。<script>
fetch("/getFileList")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error: ", error));
</script>
这样一来,你应该可以成功返回一个JSON格式的文件名列表,并避免406错误的问题。
【相关推荐】