项目版本与运行环境

  • JDK 版本:17
  • 操作系统:Windows 11
  • SpringBoot 版本:3.5.14
  • SpringCloud 版本:2025.0.2
  • OpenFeign 版本:4.3.2

引入依赖

<dependencyManagement>
    <dependencies>
        <!-- Spring Boot 相关依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.5.14</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!-- Spring Cloud 相关依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2025.0.2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
	<dependency>
	    <groupId>org.springframework.cloud</groupId>
	    <artifactId>spring-cloud-starter-openfeign</artifactId>
	</dependency>
	
	<!-- FastJson2 核心 -->
	<dependency>
	    <groupId>com.alibaba.fastjson2</groupId>
	    <artifactId>fastjson2</artifactId>
	    <version>2.0.61</version>
	</dependency>
	
	<!-- FastJson2 - Spring 集成 -->
	<dependency>
	    <groupId>com.alibaba.fastjson2</groupId>
	    <artifactId>fastjson2-extension-spring6</artifactId>
	    <version>2.0.61</version>
	</dependency>
</dependencies>

编写配置类

/**
 * OpenFeign 配置类
 *
 * @author WuJiaJun
 */
@Configuration
public class FeignFastJsonConfig {

    /**
     * 注册自定义 Decoder(反序列化器)
     */
    @Bean
    public Decoder feignDecoder(FastJsonHttpMessageConverter fastJsonConverter,
                                ObjectProvider<HttpMessageConverters> defaultConverters) {
        // 将 Fastjson 放在最前面,同时保留其他默认序列化器
        List<HttpMessageConverter<?>> all = new ArrayList<>();
        all.add(fastJsonConverter);

        /*
            安全合并默认消息转换器:
            1. 使用 ObjectProvider 防止 Bean 不存在时启动报错
            2. 保留 StringHttpMessageConverter、ByteArrayHttpMessageConverter 等基础序列化器
            避免仅配置 Fastjson 导致非 JSON 响应解码失败
         */
        defaultConverters.ifAvailable(c -> all.addAll(c.getConverters()));

        return new SpringDecoder(() -> new HttpMessageConverters(all));
    }

    /**
     * 自定义 OpenFeign 发送消息体时的序列化器
     *
     * @param fastJsonConverter FastJson2 序列化器
     */
    @Bean
    public Encoder feignEncoder(FastJsonHttpMessageConverter fastJsonConverter) {
        return new SpringEncoder(() -> new HttpMessageConverters(fastJsonConverter));
    }
}

FastJson2 配置类

  	@Bean
    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        return createFastJsonConverter();
    }

    public FastJsonHttpMessageConverter createFastJsonConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(StandardCharsets.UTF_8);
        // 序列化配置
        config.setWriterFeatures(
                JSONWriter.Feature.WriteLongAsString,      // Long → String 防精度丢失
                JSONWriter.Feature.WriteMapNullValue     // 输出 null 字段(按需)
        );
        // 反序列化配置
        config.setReaderFeatures(
                // 反序列化时忽略未知字段,避免报错
        );
        converter.setFastJsonConfig(config);
        // 设置默认字符集为 UTF-8,避免中文乱码
        converter.setDefaultCharset(StandardCharsets.UTF_8);
        // 限定转换器仅处理 application/json 媒体类型
        converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
        return converter;
    }

编写 FeignClient

/**
 * 用户服务 FeignClient
 */
@FeignClient(name = "user-service",configuration = FeignFastJsonConfig.class)
public interface UserFeignClient {

	@PostMapping("/test/users/json")
	void sendMessage(@RequestBody Map<String, Object> result);

}

user-service:用户服务
PS:使用了 Nacos

验证效果

业务服务接口:

@Resource
private UserFeignClient userFeignClient;

@PostMapping("/test/business/json")
public void testJsonOfBusiness() {
    Map<String, Object> result = new HashMap<>();
    result.put("id", 9007199254740993L); // 超出 JS 安全整数范围
    result.put("name", null);            // null 字段
    result.put("time",LocalDateTime.now());
    userFeignClient.sendMessage(result);
}

用户服务接口

@PostMapping("/test/users/json")
public void sendMessage(@RequestBody Map<String, Object> result) {
    log.info("result:{}",result)
}

接收数据为以下内容:

{
	"id":"9007199254740993",
	"name":null,
	"time":"2026-06-25 20:15:33"
}

成功使用 FastJson2 序列化器

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐