记录Springboot报错HttpMediaTypeNotAcceptableException、返回中文乱码问题

最近写了一个项目,在测试接口的时候遇到了点问题,折腾了蛮久的,所以记录一下


接口代码如下:

@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @GetMapping(value = "/view/{sharedId}")
    public String view(@PathVariable String sharedId,
                       @RequestParam(required = false) String key) {
        return myService.view(sharedId, key);
    }
}

项目中还使用了全局异常处理器捕获错误返回统一json数据

public Result handleException(Exception e){
    return Result.error(500, MessageConstant.UNKNOWN_ERROR);
}

测试使用的是knife4j-openapi3-jakarta-spring-boot-starter

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
            <version>4.5.0</version>
        </dependency>

最后启动项目使用knife4j网页测试接口idea报错如下:

a6e7ba0e6f3b41c2912ed27c69189abd.png

查阅资料得知原因:客户端请求中的Accept字段不正确或不匹配服务器的响应类型Content-Type导致的

由于第一次使用knife4j不太熟悉,在Java层尝试了很多方法都没解决,后来换了Apifox进行测试,结果没有问题。后来对比了knife4j和Apifox请求头发现了端倪

035765c0735c47e9b2cb5be75a26cc98.png

c7046fa1da7446b1bdd6c504e26cfe9d.png

最终猜测原因是knife4j网页测试请求头Accept字段值根据Java代码自动识别生成,由于在Java代码中接口返回值为String,knife4j则生成了对应的字段值,而当接口在使用中报错被全局异常处理器捕获,并返回统一json数据,导致和knife4j生成的对应字段值不匹配。

解决办法:个性化配置 -> 开启动态请求参数,在请求头部添加 Accept 参数值  */* ,表示接收所有响应类型


解决以上问题后,在返回中文时又出现乱码问题

解决办法:@GetMapping注解设置produces属性指定字符集

@GetMapping(value = "/view/{sharedId}", produces = "text/html;charset=utf-8")
public String view(@PathVariable String sharedId,
                   @RequestParam(required = false) String key) {
    return myService.view(sharedId, key);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值