@Bean public HttpMessageConverters fastJsonHttpMessageConverters() { // 创建一个FastJsonHttpMessageConverter实例,用于JSON数据的转换 FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); // 创建并配置一个FastJsonConfig实例,用于定制JSON数据的处理规则 FastJsonConfig fastJsonConfig = new FastJsonConfig(); // 设置JSON数据的序列化特性,此处为格式化输出,提高可读性 fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); // 获取全局的序列化配置实例 SerializeConfig serializeConfig = SerializeConfig.globalInstance; // 将BigInteger、Long转为String类型 serializeConfig.put(BigInteger.class, ToStringSerializer.instance); serializeConfig.put(Long.class, ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); // 配置LocalDateTime类型的数据转换为字符串类型,以适应JSON格式 serializeConfig.put(LocalDateTime.class, ToStringSerializer.instance); // 将自定义的序列化配置应用到FastJsonConfig中 fastJsonConfig.setSerializeConfig(serializeConfig); // 将配置好的FastJsonConfig应用到FastJsonHttpMessageConverter中 fastConverter.setFastJsonConfig(fastJsonConfig); // 返回包含配置好的FastJsonHttpMessageConverter的HttpMessageConverters return new HttpMessageConverters(fastConverter); }为什么我不配置以上的消息转换 @PostMapping("test") public void test(@RequestBody Map deviceReported){ System.out.println("map = " + deviceReported); }这个接口调用会出现2025-03-29 18:07:30.897 WARN 17460 --- [ XNIO-1 task-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported] 2025-03-29 18:07:30.905 WARN 17460 --- [ XNIO-1 task-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.util.LinkedHashMap]这个问题
时间: 2025-03-29 08:14:02 浏览: 32
从您提供的信息来看,`@Bean public HttpMessageConverters fastJsonHttpMessageConverters()` 这段代码的主要作用是配置 `FastJsonHttpMessageConverter` 消息转换器,并将其注册为 Spring Boot 的 HTTP 消息转换器之一。如果没有正确配置消息转换器,则可能导致某些类型的 JSON 数据无法正常解析。
以下是详细分析以及解决方案:
---
### 原因分析
当您调用接口 `/test` 并传递 JSON 格式的数据时,默认情况下,Spring MVC 使用内置的消息转换器(如 Jackson 提供的 `MappingJackson2HttpMessageConverter`)来处理请求体和响应体的内容。如果未显式地配置其他消息转换器(例如 `FastJsonHttpMessageConverter`),并且您的项目依赖了多种 JSON 序列化库(比如同时引入了 Jackson 和 Fastjson),可能会导致以下问题:
1. **默认内容协商失败**
如果没有将正确的 `HttpMessageConverter` 注册到 Spring 容器中,Spring 可能找不到支持指定 MIME 类型(如 `application/json;charset=UTF-8`)的转换器,进而抛出类似 `HttpMediaTypeNotSupportedException` 或 `HttpMessageNotReadableException` 的异常。
2. **日期等复杂类型序列化问题**
默认的 Jackson 转换器可能对一些特殊数据类型(如 `LocalDateTime`、`BigInteger` 等)缺乏定制化的序列化规则,而您通过上述代码手动设置了 Fastjson 对于这些类型的序列化方式。如果不配置此部分逻辑,就会引发诸如时间戳格式错误等问题。
3. **返回值不可写入的问题**
接口返回的对象如果是复杂的集合类(如 `LinkedHashMap`),需要相应的消息转换器能够识别并正确序列化成 JSON 字符串;若缺少合适的转换工具链则会触发 `HttpMessageNotWritableException` 异常提示“未能找到针对特定返回类型的有效转换器”。
---
### 解决方案
为了确保程序运行稳定可靠,请按照实际需求完成以下几个步骤操作:
#### 方案一:启用自定义的 Fastjson 转换器
如果您确实希望使用 Fastjson 来替代 Jackson 成为主流的消息转换机制,那么可以参考下面的做法进一步完善 Bean 配置过程:
```java
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
// 自定义全局 SerializerConfig 实例
SerializeConfig config = SerializeConfig.globalInstance;
// 添加 BigInteger 和 Long 类型映射至 String 输出形式
config.configProperty(PropertyNamingStrategy.SnakeCase); // 支持下划线命名风格
config.put(BigInteger.class, ToStringSerializer.instance);
config.put(Long.class, ToStringSerializer.instance);
config.put(LocalDateTime.class, LocalDateTimeSerializer.instance);
// 初始化基础配置项
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
fastJsonConfig.setSerializerFeatures(
SerializerFeature.WriteMapNullValue,
SerializerFeature.PrettyFormat,
SerializerFeature.DisableCircularReferenceDetect
);
fastJsonConfig.setSerializeFilters(new ValueFilter() { /* ... */ });
fastJsonConfig.setSerializeConfig(config);
// 绑定配置给 Converter
converter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(converter);
}
```
然后确认已经在项目的主启动类上添加注解 `@EnableWebMvc` 才能使该 Bean 生效覆盖原有设置。
---
#### 方案二:保持原样但调整输入输出结构适配 Jackson
假如不想完全切换回 Fastjson,也可以尝试直接修改实体模型或者前端发送过来的数据包以满足 Jackson 默认约定条件下的解析能力即可解决冲突情况的发生几率减少很多哦~
对于示例中的测试 API 方法来说只要保证传参符合标准规范就不会报错了~
---
###
阅读全文
相关推荐

















