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

调用Rest WebService时出现Accept指令不兼容错误的原因排查

解决Rest WebService调用时的Accept头兼容错误

这个错误我之前也碰到过,本质是接口声明的响应类型和实际返回的内容类型不匹配,再加上你代码里的几个隐藏问题触发了这个冲突,咱们一步步拆解解决:

1. 核心问题:split方法使用错误导致空指针/异常

看你Controller里的这段代码:

List<com.java.oxalys.beans.Stock> stock = stockService.getByLocAndItm(LOC.split("|"), null);

这里有两个致命问题:

  • |是正则表达式的元字符(表示“或”),直接用split("|")会把输入字符串的每个字符单独拆分,比如你传的BOQSCM171L会被拆成["B","O","Q","S","C","M","1","7","1","L"],完全不是你想要的按竖线分隔的效果。正确写法是转义竖线:split("\\|")。
  • 因为LOC是required=false的参数,当请求里不传这个参数时,LOC是null,调用null.split()会直接抛出空指针异常。Spring捕获这个异常后,默认会返回HTML格式的错误页面(Content-Type为text/html),但你的接口声明了produces = "application/json",这就和请求头里的Accept规则冲突,触发了这个“兼容不匹配”的错误。

修复后的Controller代码:

@RestController
@RequestMapping("stock")
public class StockController {
    @Autowired
    private StockService stockService;

    @GetMapping(value = "/TOM", produces = "application/json")
    public JsonModel getByLocAndItm(@RequestParam(required=false) String LOC, @RequestParam(required=false) String ITM) {
        JsonModel jsonModel = new JsonModel();
        // 先处理LOC为null的情况,再正确拆分参数
        String[] locArray = LOC != null ? LOC.split("\\|") : new String[0];
        List<com.java.oxalys.beans.Stock> stock = stockService.getByLocAndItm(locArray, null);
        jsonModel.setDatas(stock);
        return jsonModel;
    }
}

2. 辅助优化:确保异常场景也返回JSON格式

即使修复了split的问题,后续如果代码出现其他异常(比如DAO层逻辑错误),Spring默认还是会返回HTML错误页,依然可能触发这个错误。你可以添加全局异常处理器,确保所有异常都返回JSON格式响应:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public JsonModel handleException(Exception e) {
        JsonModel jsonModel = new JsonModel();
        jsonModel.setCode("500");
        jsonModel.setMsg("服务器内部错误:" + e.getMessage());
        return jsonModel;
    }
}

3. 额外提示:DAO层的测试逻辑问题

你的DAO层目前只是返回一个测试用的Stock对象,把where语句塞到了Itmoxa字段里,这显然不是最终的业务逻辑,后续对接数据库时,记得把这段测试代码替换成真正的SQL查询逻辑,避免返回不符合预期的数据。

验证步骤

  1. 把修复后的代码重新部署,用Postman调用localhost:8080/Oxalys_WS/stock/TOM?LOC=BOQSCM171L
  2. 查看响应的Content-Type是否为application/json,同时检查返回的JSON数据是否符合预期

内容的提问来源于stack exchange,提问作者pheromix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:49:20