【问题标题】:FeignClient: Serialize RequestParam to JSONFeignClient:将 RequestParam 序列化为 JSON
【发布时间】:2017-07-15 06:50:16
【问题描述】:

我有一个 Spring Boot 应用程序,我在其中尝试使用 Feign 与远程服务进行通信。我的@FeignClient定义如下:

@FeignClient(name="TEST_SERVICE", url="URL")
@Component
public interface SomeServiceClient
{
    @RequestMapping(
        method = RequestMethod.POST,
        value = "/someService",
        consumes = "application/json",
        produces = "application/json"
    )
    SomeServiceResult getServiceResult(
        @RequestParam(value = "mode") String mode,
        @RequestParam(value = "payload") SomeServicePayload payload
    );
}

我希望将 SomeServicePayload 类型的 payload 对象序列化为 JSON。我希望这会自动发生,但事实并非如此。相反,payload 被序列化为其完全限定的类名。

我是否需要为此客户端设置自定义编码器/解码器组合?我该怎么做?

【问题讨论】:

    标签: spring-boot jackson feign


    【解决方案1】:

    @FeignClient 在后台使用toString() 方法来构建请求字符串。创建正确请求的最简单方法是手动覆盖 toString() 方法:

    class SomeServicePayload{
        String payload;
    
        @Override
        public String toString() {
            return "{\"payload\":\"" + payload + "\"}";
        }
    }
    

    或者使用 ObjectMapper 来处理复杂的对象:

    public class SomeServicePayload{
    
        private String payload;
    
        public String getPayload() {
            return payload;
        }
    
        public void setPayload(String payload) {
            this.payload = payload;
        }
    
        private ObjectMapper mapper = new ObjectMapper();
        @Override
        public String toString() {
            try {
                return mapper.writeValueAsString(this);
            } catch (JsonProcessingException e) {
                //...
            }
            return null;
        }
    }
    

    【讨论】:

    • 真的吗? Feign 是否依赖 toString() 而不是 Spring 的 ObjectMapper?我看不到任何好处。如何将此行为切换为使用 ObjectMapper?例如,使用对象映射器允许序列化包括元数据属性,例如类型信息,它可以在序列化对象上启用多态性。我需要为 Feign 实现这种行为。
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多