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

Springboot Feign API返回200但客户端捕获响应为null问题排查

问题:Spring Boot Feign API 响应为null,但服务器返回200状态码

我开发的Spring Boot Feign API能正常命中服务器并返回200状态码,用Postman也能看到这个状态码,但客户端代码捕获到的响应是null,不清楚客户端为什么无法解码响应。相关代码如下:

配置Bean代码

@Bean
fun buildClient(
    objectMapper: ObjectMapper,
    @Value("\${cbase-uri}") url: String
): Client {
    return FeignApiBuilder.builder(Client::class.java, url) { it }
        .build()
}

API接口代码

@Headers(
    "Accept: ${MimeTypeUtils.APPLICATION_JSON_VALUE}",
    "Content-Type: ${MimeTypeUtils.APPLICATION_JSON_VALUE}"
)
interface Client {
    @RequestLine("POST /v1/test")
    fun submit(
        request: body
    ): ResponseEntity<Unit>
}

实现类代码

override fun test(request: body) {
    try {
        val response = client.submit(request)
        if (response.statusCodeValue == 200) {
            logger.info("Success")
            return
        } else {
            throw Exception("Internal Server Error")
        }
    } catch (e: Exception) {
        throw Exception("Exception occurred while calling submit api", e)
    }
}
解决方案

问题核心在返回类型ResponseEntity<Unit>的处理上:

  • Feign对Unit(对应Java的Void)的逻辑是:当响应体为空时,不会包装成ResponseEntity实例,直接返回null。哪怕服务器返回200状态码,只要响应体为空,就会出现这个情况。

提供两种解决方式:

  1. 修改返回类型为Response<Void>
    把接口返回类型改成Response<Void>,Feign能正确解析状态码和响应头,不会返回null:

    @RequestLine("POST /v1/test")
    fun submit(request: body): Response<Void>
    

    调用时通过response.status()获取状态码即可。

  2. 用空DTO替代Unit
    如果一定要保留类似ResponseEntity的包装,可以定义一个空的DTO类(比如EmptyResponse),将返回类型改为ResponseEntity<EmptyResponse>。服务器返回空JSON{}时,Feign能正常解析出对象,不会返回null。

额外注意:

  • 确认Feign配置中已正确注册JSON解码器(如JacksonDecoder),避免因解码器缺失导致的解析异常。
  • 检查服务器返回的响应体:如果返回的是空白而非空JSON,也可能引发解析问题,需要和服务端确认返回格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:30:06