You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:30:57