Spring Boot 配置消息转换器

本文介绍了如何在SpringBoot中配置自定义消息转换器MappingJackson2HttpMessageConverter,并添加登录拦截器,简化了JSON数据的处理。

消息转换器

配合注解,实现接口返回 JSON 数据
Spring MVC中使用消息转换器HttpMessageConverter对JSON的转换提供了很好的支持

在Spring Boot中更进一步,对相关配置做了更进一步的简化,添加 Web 依赖 spring-boot-start-web 后,这个依赖中默认加入了jackson-databind作为JSON处理器,此时不需要添加额外的JSON处理器就能返回一段JSON了

com.fasterxml.jackson.annotation.JsonFormat

com.fasterxml.jackson.annotation.JsonFormat

package cn.yto.server.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * <p>
 * 实现 WebMvcConfigurer 接口,自定义 Spring MVC 配置<br>
 * 1、添加拦截器<br>
 * 2、配置消息转换器 MappingJackson2HttpMessageConverter
 * </p>
 *
 * @author yanyg
 * @date 2021/9/10 11:17
 */
@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    @Autowired
    private AppLoginInterceptor appLoginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 登录拦截器
        registry.addInterceptor(appLoginInterceptor).addPathPatterns("/getLoginUser");
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, new MappingJackson2HttpMessageConverter());
    }


}
<think>我们正在讨论在Spring Boot配置和使用Gson消息转换器。根据引用[1]和引用[2]中的信息,我们可以通过配置一个GsonHttpMessageConverter来替换默认的Jackson转换器。以下是具体步骤: 1. **添加Gson依赖**:在pom.xml中添加Gson库的依赖。 2. **创建配置类**:通过@Configuration注解定义一个配置类,并在其中创建GsonHttpMessageConverter的Bean。 3. **自定义Gson实例**(可选):如果需要定制Gson的行为(比如日期格式),可以创建一个Gson实例并进行配置。 引用[1]中提供了一个配置类的示例,但请注意,在Spring Boot中,我们通常不需要手动注册GsonHttpMessageConverter,因为Spring Boot的自动配置会检测到Gson的存在并自动配置一个转换器。但是,如果我们想要自定义Gson的行为,则需要自己创建Gson实例并配置到转换器中。 另外,引用[3]中提到了使用FastJson的配置,但我们现在关注的是Gson,因此可以参考其配置方式,但使用Gson相关的类。 下面我将详细说明两种方法:一种是让Spring Boot自动配置Gson转换器(通过配置属性),另一种是手动配置Gson转换器(通过Java配置类)。 ### 方法1:使用Spring Boot的自动配置(推荐) Spring Boot的`spring-boot-starter-web`默认包含Jackson,但如果我们排除Jackson并添加Gson依赖,Spring Boot会自动配置Gson。 步骤: 1. 排除Jackson依赖,并添加Gson依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> ``` 2. 在`application.properties`或`application.yml`中配置Gson属性(可选): ```properties spring.gson.date-format=yyyy-MM-dd HH:mm:ss spring.gson.pretty-printing=true # 其他配置,如是否序列化null值等 ``` Spring Boot会自动根据这些属性配置Gson,并创建GsonHttpMessageConverter。 ### 方法2:手动配置Gson消息转换器 如果我们想要更精细地控制Gson的配置,可以手动创建GsonHttpMessageConverter的Bean。此时,我们不需要排除Jackson(因为手动配置的转换器会优先),但通常我们还是会排除Jackson以避免冲突或节省资源。 步骤: 1. 排除Jackson并添加Gson依赖(同上)。 2. 创建一个配置类,定义`GsonHttpMessageConverter`的Bean: ```java import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.GsonHttpMessageConverter; @Configuration public class GsonConfig { @Bean public GsonHttpMessageConverter gsonHttpMessageConverter() { GsonHttpMessageConverter converter = new GsonHttpMessageConverter(); converter.setGson(gson()); return converter; } @Bean public Gson gson() { return new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") .serializeNulls() // 序列化null值 .create(); } } ``` 注意:在Spring Boot中,如果我们手动注册了一个`HttpMessageConverter`,那么默认的转换器(包括Jackson)将不会被自动配置。所以,如果我们同时想要使用Gson和Jackson,则需要同时配置两者,并且注意顺序(通过实现`WebMvcConfigurer`接口并重写`configureMessageConverters`方法,然后添加多个转换器)。 ### 测试 配置完成后,我们可以编写一个简单的Controller进行测试: ```java @RestController public class TestController { @GetMapping("/test") public User test() { User user = new User(); user.setName("John"); user.setAge(30); user.setBirthday(new Date()); return user; } } ``` 访问`/test`,应该会返回JSON格式的数据,并且日期格式为我们设置的格式。 ### 总结 - 如果只需要使用Gson替换Jackson,推荐使用方法1(自动配置),简单方便。 - 如果需要深度定制Gson,则使用方法2(手动配置)。 ### 注意事项 - 如果项目中同时存在Jackson和Gson的转换器,Spring MVC会按照转换器注册的顺序选择第一个能够处理请求的转换器。为了避免不确定性,通常我们只保留一个JSON转换器。 - 如果使用手动配置,并且想要完全控制消息转换器,可以实现`WebMvcConfigurer`接口,然后重写`configureMessageConverters`方法,并添加自己的转换器。这样会覆盖默认的转换器列表。 §§相关问题§§ 1. Spring Boot中如何同时使用Gson和Jackson作为JSON消息转换器? 2. 如何自定义Gson的序列化和反序列化规则? 3. 在Spring Boot中如何配置多个HttpMessageConverter?</think>### Spring Boot 配置和使用 Gson 消息转换器详解 #### 一、核心配置步骤 1. **添加 Gson 依赖** 在 `pom.xml` 中排除 Jackson 并添加 Gson 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 排除 Jackson --> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> <!-- 使用最新稳定版 --> </dependency> ``` 2. **创建 Gson 配置类** ```java import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.GsonHttpMessageConverter; @Configuration public class GsonConfig { // 自定义 Gson 实例 @Bean public Gson gson() { return new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") // 日期格式 .serializeNulls() // 序列化 null 值 .disableHtmlEscaping() // 禁用 HTML 转义 .create(); } // 注册消息转换器 @Bean public GsonHttpMessageConverter gsonHttpMessageConverter(Gson gson) { GsonHttpMessageConverter converter = new GsonHttpMessageConverter(); converter.setGson(gson); // 注入自定义 Gson 配置 return converter; } } ``` #### 二、高级配置选项 1. **自定义序列化规则** ```java @Bean public Gson gson() { return new GsonBuilder() .registerTypeAdapter(LocalDateTime.class, new JsonSerializer<LocalDateTime>() { @Override public JsonElement serialize(LocalDateTime src, Type type, JsonSerializationContext context) { return new JsonPrimitive(src.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); } }) .create(); } ``` 2. **配置转换器优先级** ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired private GsonHttpMessageConverter gsonConverter; @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 确保 Gson 转换器优先于其他转换器 converters.add(0, gsonConverter); } } ``` #### 三、验证配置效果 创建测试 Controller: ```java @RestController public class TestController { @GetMapping("/user") public User getUser() { return new User("张三", 28, LocalDateTime.now()); } @Data @AllArgsConstructor static class User { private String name; private Integer age; private LocalDateTime createTime; } } ``` 访问 `/user` 将返回 Gson 格式化的 JSON: ```json { "name": "张三", "age": 28, "createTime": "2023-08-15T14:30:45" } ``` #### 四、配置注意事项 1. **与 Jackson 共存问题** - 若需同时保留 Jackson,需显式指定转换器顺序 - 在 `WebMvcConfigurer` 中手动排序: ```java converters.add(new MappingJackson2HttpMessageConverter()); // Jackson converters.add(gsonConverter); // Gson ``` 2. **特殊格式处理** | 数据类型 | Gson 默认行为 | 推荐配置方法 | |---------------|--------------------|--------------------------| | 日期时间 | ISO-8601 格式 | `setDateFormat()` | | null 字段 | 自动忽略 | `serializeNulls()` | | HTML 特殊字符 | 自动转义 | `disableHtmlEscaping()` | | 浮点数 | 可能丢失精度 | `setPrettyPrinting()` | 3. **性能优化建议** - 使用 `GsonBuilder.create()` 重用 Gson 实例 - 启用缓存:`new GsonBuilder().enableComplexMapKeySerialization()` - 对于大型对象启用流式处理 > **最佳实践**:生产环境建议通过 `@ConditionalOnMissingBean` 保证配置唯一性[^2]: > ```java > @Bean > @ConditionalOnMissingBean > public GsonHttpMessageConverter gsonConverter() {...} > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值