通常解决方案参考
https://blog.csdn.net/qq_42651201/article/details/120710224
我的报错
org.springframework.http.converter.HttpMessageNotWritableException:
No converter for [class com.xxx.dto.Result] with preset Content-Type 'application/vnd.ms-excel;charset=utf-8'
我的问题根因
controller处理逻辑有问题,导致报错,然后被全局异常捕捉,再然后返回了错误信息
也就是说本来没有返回值的方法,最终有返回值class com.xxx.dto.Result ,就会抛出以上错误。
我的解决方案
把controller里面的报错解决,让逻辑正常执行,不报错,不被全局异常捕捉即可
以上为我遇到的问题根因和解决方案
另外还有种情况 也可能会报以上错误,就是表格列的 index的值重复
@ExcelProperty(value = "字段", index = 0)
以下是具体的分析步骤,可看,可略过。
我的代码情况:
1. controller内无返回值,因此不适用通常解决方案
public void downloadExt(HttpServletResponse response, DataQuery qry) throws IOException {
try {
// 查询数据 导出数据逻辑
} catch (Exception e) {
throw new BsException("文件下载失败");
}
}
2. 再细看日志,报错内其他信息
org.springframework.http.converter.HttpMessageNotWritableException:
No converter for [class com.xxx.dto.Result] with preset Content-Type 'application/vnd.ms-excel;charset=utf-8'
发现虽然接口代码没有返回值,但是 前端请求接口的时候 的确返回了 com.xxx.dto.Result 对象
3. 查看代码是否有全局异常处理
public class ExceptionHandler implements GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Result errorException(Exception e) {
log.error(e.getMessage(), e);
return Result.fail(xxxx);
}
}
经查看,是全局异常处理捕捉了第1步的controller抛出的异常,然后返回了Result对象,导致下载报错。
但是 根因不在这里,而是在导出的controller代码里面报错了
public void downloadExt(HttpServletResponse response, DataQuery qry) throws IOException {
try {
**// 查询数据 导出数据逻辑**
} catch (Exception e) {
log.info(null, e);
throw new BsException("文件下载失败");
}
}
打出日志,查看日志,即可解决问题