Spring Boot接口返回406 Not Acceptable错误但功能正常的排查求助
解决Spring Boot 406 Not Acceptable错误方案
错误原因
核心问题是Controller方法返回的WriteFiles对象无法被Jackson序列化为JSON:你的WriteFiles类仅在构造函数接收了name和number参数,但未将它们保存为类的成员变量,也没有提供getter方法。Jackson无法提取任何可序列化的数据,导致Spring无法生成符合请求Accept头要求的响应格式,最终抛出HttpMediaTypeNotAcceptableException并返回406状态码。
具体解决方案
方案1:修改WriteFiles类,支持Jackson序列化
给WriteFiles添加成员变量和getter方法,让Jackson能读取到数据:
import java.time.LocalDate; import java.io.File; import java.io.FileWriter; public class WriteFiles { // 添加成员变量保存参数 private final String name; private final int number; public WriteFiles(final String name, final int number) { this.name = name; this.number = number; } // 添加getter方法 public String getName() { return name; } public int getNumber() { return number; } public void file(String name, int number) { // 原方法逻辑保持不变 try { String header = "*** Writing File for " + name + "***\n"; String footer = "\n ---- FILE COMPLETE! GENERATED ON: " + LocalDate.now(); String detail = "TOTAL: --- " + number; System.out.println("AWAIT FILE GENERATION!"); File myFile = new File("newFile.txt"); if (myFile.exists()) { myFile = new File("newerFile" + number + ".txt"); } FileWriter writeFile = new FileWriter(myFile); writeFile.write(header); writeFile.write("--------------------------\n"); writeFile.write(detail + "\n"); writeFile.write(detail + " DOUBLED! " + (number * 2) + "\n"); writeFile.write(detail + " HALVED! " + (number / 2) + "\n"); writeFile.write(detail + " SQUARED! " + number * number + "\n"); writeFile.write(detail + " PLUS 78! " + (number + 78) + "\n"); writeFile.write(detail + " MINUS 23! " + (number - 23) + "\n"); writeFile.write("--------------------------\n"); writeFile.write(footer); writeFile.close(); } catch (Exception e) { e.printStackTrace(); } } }
方案2:返回自定义响应DTO或简单字符串
如果不需要返回WriteFiles对象,直接返回操作结果更合理:
@PostMapping("entry") @ResponseStatus(HttpStatus.CREATED) public String getFileParams(@RequestBody IncomingData incomingData) { String name = incomingData.getName(); int number = incomingData.getNumber(); WriteFiles file = new WriteFiles(name, number); file.file(name,number); // 返回包含文件名的成功提示 String fileName = new File("newFile.txt").exists() ? "newerFile" + number + ".txt" : "newFile.txt"; return "文件写入成功,文件名:" + fileName; }
也可以定义专门的响应DTO,让返回格式更规范:
// 自定义响应DTO public class FileWriteResponse { private String message; private String fileName; public FileWriteResponse(String message, String fileName) { this.message = message; this.fileName = fileName; } public String getMessage() { return message; } public String getFileName() { return fileName; } }
修改Controller返回该DTO:
@PostMapping("entry") @ResponseStatus(HttpStatus.CREATED) public FileWriteResponse getFileParams(@RequestBody IncomingData incomingData) { String name = incomingData.getName(); int number = incomingData.getNumber(); WriteFiles file = new WriteFiles(name, number); file.file(name,number); String fileName = new File("newFile.txt").exists() ? "newerFile" + number + ".txt" : "newFile.txt"; return new FileWriteResponse("文件写入成功", fileName); }
方案3:不返回任何内容
如果不需要给前端返回数据,直接将方法返回类型改为void:
@PostMapping("entry") @ResponseStatus(HttpStatus.CREATED) public void getFileParams(@RequestBody IncomingData incomingData) { String name = incomingData.getName(); int number = incomingData.getNumber(); WriteFiles file = new WriteFiles(name, number); file.file(name,number); }
或者用ResponseEntity<Void>更明确控制响应:
@PostMapping("entry") public ResponseEntity<Void> getFileParams(@RequestBody IncomingData incomingData) { String name = incomingData.getName(); int number = incomingData.getNumber(); WriteFiles file = new WriteFiles(name, number); file.file(name,number); return ResponseEntity.status(HttpStatus.CREATED).build(); }
内容的提问来源于stack exchange,提问作者Adam C. MacKinnon
相关产品推荐
相关产品推荐

