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状态码,只要响应体为空,就会出现这个情况。
提供两种解决方式:
修改返回类型为
Response<Void>
把接口返回类型改成Response<Void>,Feign能正确解析状态码和响应头,不会返回null:@RequestLine("POST /v1/test") fun submit(request: body): Response<Void>调用时通过
response.status()获取状态码即可。用空DTO替代
Unit
如果一定要保留类似ResponseEntity的包装,可以定义一个空的DTO类(比如EmptyResponse),将返回类型改为ResponseEntity<EmptyResponse>。服务器返回空JSON{}时,Feign能正常解析出对象,不会返回null。
额外注意:
- 确认Feign配置中已正确注册JSON解码器(如JacksonDecoder),避免因解码器缺失导致的解析异常。
- 检查服务器返回的响应体:如果返回的是空白而非空JSON,也可能引发解析问题,需要和服务端确认返回格式。
内容的提问来源于stack exchange,提问作者user4974500
相关产品推荐
相关产品推荐

