调用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查询逻辑,避免返回不符合预期的数据。
验证步骤
- 把修复后的代码重新部署,用Postman调用
localhost:8080/Oxalys_WS/stock/TOM?LOC=BOQSCM171L - 查看响应的Content-Type是否为
application/json,同时检查返回的JSON数据是否符合预期
内容的提问来源于stack exchange,提问作者pheromix
相关产品推荐
相关产品推荐

