feign调post传参出参不能序列化Could not write request: no suitable HttpMessageConverter found for request type

本文分析了一个在使用Feign接口进行POST请求时遇到的问题,即因找不到适合的HttpMessageConverter导致请求序列化失败。解决方案是在接口方法上指定consumes为MediaType.APPLICATION_JSON_UTF8_VALUE,并使用@RequestBody和@ResponseBody注解确保参数和返回值的JSON格式化。通过这些调整,可以成功处理JSON格式的POST请求参数。

首先贴异常描述:

Could not write request: no suitable HttpMessageConverter found for request type [com.tellhow.userapi.entity.TestModel]

出现异常的背景:

feign接口调用post请求,请求参数(加了@RequestBody)要求json格式(应该post参数json请求都用这个解决方案可行)

异常分析:

无法写入请求:没有找到适合请求类型,也就是说调用feign接口时,参数序列化失败。

解决方案:post方法路径指定处理请求的提交内容类型(consumes)

 @PostMapping(value = "/saveUserTest",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
 @ResponseBody
 public TeStModel saveUserTest(@RequestBody TeStModel testModel) {

}

记得加上@RequestBody和@ResponseBody进行入参和出参的json格式化。

在使用 `RestTemplate` 或 `Feign` 发送 HTTP 请求时,如果遇到类似以下错误: ``` Could not write request: no suitable HttpMessageConverter found for request type [java.util.HashMap] and content type [application/json;charset=UTF-8] ``` 这表明 Spring 无法找到合适的 `HttpMessageConverter` 来处理请求体的类型(如 `HashMap`)和内容类型(如 `application/json`)。以下是几种常见的解决方案。 ### 检查并添加必要的依赖 确保项目中包含了处理 JSON 的库,例如 Jackson。通常情况下,Spring Boot 会自动配置 `Jackson2JsonMessageConverter`,前提是类路径上有 Jackson 库。 ```xml <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.0</version> </dependency> ``` 如果使用的是 Spring Boot,则只需添加以下 starter 即可自动引入相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` ### 手动注册 `HttpMessageConverter` 如果你没有使用 Spring Boot 或者需要自定义 `RestTemplate`,可以手动添加 `Jackson2JsonMessageConverter` 到 `RestTemplate` 中。 ```java import org.springframework.http.converter.json.Jackson2JsonMessageConverter; import org.springframework.web.client.RestTemplate; public class RestClientConfig { public static RestTemplate getRestTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new Jackson2JsonMessageConverter()); return restTemplate; } } ``` ### 使用 `@RequestBody` 和 `@ResponseBody` 注解 当使用 `@RequestBody` 或 `@ResponseBody` 注解时,Spring 会根据请求头中的 `Content-Type` 和返回值类型选择合适的 `HttpMessageConverter`。确保控制器方法数上使用了 `@RequestBody`,并且客户端发送的请求设置了正确的 `Content-Type: application/json` [^4]。 ### 配置 Feign 客户端的编码器 如果你使用的是 OpenFeign,并且遇到类似问题,可以通过自定义 `Encoder` 来解决此问题。确保 Feign 客户端配置中使用了 `SpringEncoder` 并配合 `ObjectMapper`。 ```java import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.fasterxml.jackson.databind.ObjectMapper; @Configuration public class FeignClientConfig { @Bean public Encoder feignEncoder() { return new SpringFormEncoder(new Jackson2JsonMessageConverter()); } } ``` ### 确保泛型类型信息保留 在某些场景下,如果传递的是泛型对象(例如 `List<T>` 或 `Map<K,V>`),Java 的类型擦除可能会导致 Spring 无法正确识别目标类型。此时可以考虑使用 `ParameterizedTypeReference` 来保留泛型信息。 ```java ResponseEntity<String> response = restTemplate.postForEntity( "http://example.com/api", new ParameterizedTypeReference<HashMap<String, Object>>() {}, String.class ); ``` ### 总结 以上方案涵盖了从依赖管理、手动配置 `HttpMessageConverter`、注解使用到泛型类型处理等多个方面,能够有效解决 `no suitable HttpMessageConverter found` 的问题。关键在于确保系统中有可用的 JSON 转换器,并且请求/响应的数据类型与转换器支持的类型匹配 [^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值