Springboot 引用fastjson 返回json中文乱码

本文介绍如何在SpringBoot高版本中解决响应乱码问题,通过自定义FastJsonHttpMessageConverter并设置FastJsonConfig来替代过期的server.servlet.encoding.force-response配置。

因为SPRINGBOOT版本为2.7.5

原始版本较低,使用

server.servlet.encoding.force-response=true,可以解决乱码问题

但在高版本springboot 项目的application.properties,中用server.servlet.encoding.force-response=true,报红提示过期

正确方法使用

server.servlet.encoding.force-response=true

配置类

@Configuration
public class MyFastJsonConfig {
   @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM-dd");
        config.setCharset(Charset.forName("UTF-8"));
        config.setSerializerFeatures(
                SerializerFeature.WriteClassName,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty
        );
        converter.setFastJsonConfig(config);
        return converter;
    }
}

 

<think> 我们正在解决的实际问题是:Spring Boot查询表接口返回中文为null的解决方案 根据用户提供的引用和问题,我们可以总结出几个可能导致返回中文为null的原因及解决方案: 可能原因1:数据库字符集配置问题 - 数据库连接字符串需要指定字符编码(如utf-8) - 引用[1]中配置了:`url: jdbc:mysql://localhost:3306/list_practice?useUnicode=true&characterEncoding=utf-8&userSSL=true&serverTimezone=UTC` 其中`useUnicode=true`和`characterEncoding=utf-8`就是确保使用UTF-8编码。 可能原因2:返回JSON时null值被序列化为空字符串,但用户的问题是中文为null(即字段存在但值为null),而我们希望的是返回null时显示为空字符串?或者用户的问题是字段值在数据库里不为null,但返回给前端却变成了null? 但是,用户明确描述的是“返回中文为null”,这里可能存在两种情况: a) 数据库中的中文字段值在查询后变成了null(可能是映射问题) b) 数据库中存储的就是null,而用户希望将null转换为空字符串返回 根据引用[3]:若依spring-boot myBatis Xml查询部分字段为null的解决方案。原因是带有下划线的字段无法查询,因为实体类的命名是驼峰,和数据库不对应。所以需要开启驼峰转换。 - 解决方案:在mybatis配置中设置`mapUnderscoreToCamelCase: true`(如果是使用yml配置)或者在mybatis-config.xml中添加: ```xml <setting name="mapUnderscoreToCamelCase" value="true"/> ``` 另外,引用[2]提到了当返回数据为null时返回空字符串的配置(使用Jackson)。但需要注意的是,这会将所有为null的字段都转换为空字符串,包括非中文字段。 因此,我们分步骤来排查: 步骤1:确认数据库连接字符编码正确(如引用[1]中的配置) 步骤2:确认数据库表的字符集为utf8(或utf8mb4),并且表中存储的中文数据正常(直接查询数据库确认) 步骤3:确认MyBatis的驼峰命名转换开启(解决字段名映射问题,因为数据库字段名通常用下划线,而Java实体用驼峰,如果不开启则映射不上,导致值为null) 步骤4:如果数据库里存储的就是null,而用户希望将null转为空字符串,则可以按照引用[2]配置Jackson,将null序列化为空字符串。 现在,用户的问题是“查询表接口返回中文为null”,我们重点考虑步骤3,因为如果字段名映射不上,那么即使数据库有值,也会是null。 解决方案详细说明: 方案A:开启MyBatis驼峰命名映射(如果是字段名映射问题) - 如果是Spring Boot整合MyBatis,可以在application.yml中配置: ```yaml mybatis: configuration: map-underscore-to-camel-case: true ``` - 或者通过mybatis-config.xml配置(需要指定配置文件位置): ```xml <configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration> ``` 方案B:检查SQL语句中的字段别名(如果SQL语句中使用了别名,确保别名与实体属性名一致) 方案C:如果数据库存储的是null,而希望返回空字符串,则配置Jackson(如引用[2]) - 创建一个配置类,配置ObjectMapper: ```java @Configuration public class JacksonConfig { @Bean @Primary public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(""); } }); return objectMapper; } } ``` 注意:这样配置后,所有为null的字段都会变成空字符串,包括数字、布尔等其他类型,所以需要谨慎。如果只想对字符串类型的null进行处理,可以自定义序列化器。 方案D:如果数据库中存储的中文在Java程序中获取时已经是乱码或null,则检查数据库连接、表字段字符集以及服务器字符编码。 因此,针对用户问题,我们首先推荐方案A(开启驼峰映射),因为这是最常见的问题。如果问题仍然存在,再检查方案D(字符集)和方案C(null转空字符串)。 总结步骤: 1. 开启MyBatis驼峰命名自动转换(如果字段名是下划线风格) 2. 确认数据库连接字符串中指定了字符编码为UTF-8 3. 确认数据库表的字符集为UTF-8(或utf8mb4) 4. 如果数据库中的值就是null,且希望返回空字符串,则配置Jackson的null序列化 注意:如果用户的问题是由于字段名映射失败导致的null,那么开启驼峰映射后就能解决问题。如果是数据库里存储的就是null,那么需要判断是否希望将null转为空字符串。 根据用户描述“返回中文为null”,我们更倾向于认为是映射问题(因为数据库里有值,但返回为null),所以重点检查方案A。 最后,如果以上方案都不能解决,还可以检查: - 实体类中字段是否为private以及是否有对应的getter/setter - 是否使用了@JsonProperty等注解导致序列化问题 生成相关问题: 1. 如何配置MyBatis的驼峰命名转换? 2. Spring Boot中如何配置Jackson将null转换为空字符串? 3. 数据库连接字符串中的字符集配置有哪些注意事项? 4. 如何检查数据库表的字符集? 回答结构: 1. 问题分析 2. 解决方案(步骤) 3. 详细配置示例 4. 相关问题 </think> ### Spring Boot查询表接口返回中文为null的解决方案 #### 📌 核心问题解析 当Spring Boot查询接口返回中文数据为null时,通常由以下原因导致: 1. **数据库字符集不兼容**:数据库连接未指定UTF-8编码 2. **序列化配置问题**:JSON序列化未处理null值 3. **字段映射错误**:数据库下划线字段未映射到Java驼峰属性 --- ### 🔧 解决方案及实施步骤 #### 方案1:配置数据库UTF-8字符集(解决乱码导致null) 在`application.yml`中确保连接字符串包含UTF-8参数: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC # 关键参数说明 ↓ # useUnicode=true 启用Unicode编码 # characterEncoding=utf-8 强制使用UTF-8 ``` > ⚠️ **验证步骤**: > 1. 登录MySQL执行 `SHOW VARIABLES LIKE 'character_set%';` > 2. 确认`character_set_server`和`character_set_database`值为`utf8mb4`[^1] #### 方案2:配置Jackson序列化null值(解决JSON返回null) 创建Jackson配置类处理null值: ```java @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 将null值序列化为空字符串 mapper.getSerializerProvider().setNullValueSerializer( (value, gen, serializer) -> gen.writeString("") ); return mapper; } } ``` > ✅ **效果**:所有返回JSON中的null值自动转为`""`[^2] #### 方案3:启用MyBatis驼峰映射(解决字段映射失效) 在`application.yml`中添加: ```yaml mybatis: configuration: map-underscore-to-camel-case: true # 启用下划线转驼峰 ``` 或XML配置(适用于传统配置): ```xml <configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration> ``` > 💡 **原理**:将`user_name`自动映射到Java属性`userName`[^3] --- ### 🔍 综合排查流程 ```mermaid graph TD A[接口返回中文null] --> B{检查数据库字符集} B -->|UTF-8未配置| C[添加characterEncoding=utf-8] B -->|已配置| D{检查MyBatis日志} D -->|字段未映射| E[启用mapUnderscoreToCamelCase] D -->|字段正常| F{检查JSON序列化} F -->|null未处理| G[配置Jackson null序列化] ``` --- ### 📚 相关问题 1. 如何验证MySQL数据库的字符集配置是否正确? 2. Spring Boot中如何自定义特定字段的JSON序列化规则? 3. MyBatis驼峰映射失效的常见原因有哪些? 4. 如何同时配置Jackson和FastJSON处理null值? 5. 除了中文null,数据库查询结果全为null的排查思路是什么? [^1]: 数据库连接配置与字符集关系 [^2]: Jackson序列化处理null值的核心机制 [^3]: MyBatis字段映射规则详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值