JSON 编码器的主要功能是将 Java 对象转换为 JSON 格式的字符串。在 Feign 中,当你通过接口方法发送请求,并且请求体(RequestBody)是一个 Java 对象时,编码器就会发挥作用。例如,你有一个 Java 对象User,包含 id、name 和 age 属性,当你使用 Feign 调用一个服务并且需要将 User 对象作为请求体发送时,编码器会将 User 对象转换为 JSON 字符串,如 {"id":1, "name": "John", "age": 30},然后这个 JSON 字符串会作为请求的主体发送到服务端。
JSON 解码器的作用与编码器相反。它接收服务端返回的 JSON 格式的字符串,并将其转换为 Java 对象。例如,服务端返回一个 JSON 字符串 {"id":1, "name": "John", "age": 30},解码器会将这个 JSON 字符串转换为相应的 Java 对象。
下面将介绍 Netflix Feign 中的 JSON 编码/解码器。
Gson 是 Google 提供的一个 Java 库,用于在 Java 对象和 JSON 数据之间进行转换。它提供了简单而强大的 API,可以轻松地将 Java 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Java 对象。Gson 库在处理 JSON 数据方面非常高效和灵活,被广泛应用于各种 Java 项目中,特别是在网络通信、数据存储和配置文件读取等场景。
添加 Maven 依赖:
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-gson</artifactId> <version>11.8</version> </dependency>
Gson 模块添加了默认编码器和解码器,以便你可以开始使用 JSON API。将 GsonEncoder 和/或 GsonDecoder 添加到你的 Feign.Builder 中,如下所示:
package com.hxstrive.demo_netflix_feign.feign; import com.hxstrive.demo_netflix_feign.entity.User; import feign.*; import feign.codec.Decoder; import feign.codec.Encoder; import feign.gson.GsonDecoder; import feign.gson.GsonEncoder; import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; public interface EncodeDecodeFeign { @RequestLine("POST /simple/encode") @Headers("Content-Type: application/json") User encode(User user); // 创建Feign客户端实例的静态方法 static EncodeDecodeFeign create() { return Feign.builder() // 使用 Gson 编码器 .encoder(new GsonEncoder()) // 使用 Gson 解码器 .decoder(new GsonDecoder()) .contract(new Contract.Default()) .target(EncodeDecodeFeign.class, "http://localhost:8090"); } }
Jackson 是一个流行的、高性能的 Java JSON 处理库。它提供了一整套的工具来处理 JSON 数据的序列化(将 Java 对象转换为 JSON)和反序列化(将 JSON 转换为 Java 对象)。Jackson 在许多 Java 项目中被广泛使用,尤其是在 Web 开发和数据交换领域。它具有丰富的功能和灵活的配置选项,可以适应各种复杂的 JSON 处理场景。
添加 Maven 依赖:
<dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-jackson</artifactId> <version>11.8</version> </dependency>
Jackson 模块添加了一个编码器和解码器,你可以在 JSON API 中使用。像这样将 JacksonEncoder 和 JacksonDecoder 添加到你的 Feign.Builder 中:
package com.hxstrive.demo_netflix_feign.feign; import com.hxstrive.demo_netflix_feign.entity.User; import feign.*; import feign.codec.Decoder; import feign.codec.Encoder; import feign.gson.GsonDecoder; import feign.gson.GsonEncoder; import feign.jackson.JacksonDecoder; import feign.jackson.JacksonEncoder; public interface EncodeDecodeFeign { @RequestLine("POST /simple/encode") @Headers("Content-Type: application/json") User encode(User user); // 创建Feign客户端实例的静态方法 static EncodeDecodeFeign create() { return Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .contract(new Contract.Default()) .target(EncodeDecodeFeign.class, "http://localhost:8090"); } }