【问题标题】:How to handle Feign Client response as JSONObject如何将 Feign 客户端响应作为 JSONObject 处理
【发布时间】:2021-12-08 13:14:45
【问题描述】:

Service 以 gson.JsonObject 的形式返回响应。从服务 B 使用 Feign Client 调用服务 A。如何处理响应?在下面尝试:

@FeignClient(name = "ABC")
public interface TestDataProviderApi {
   @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    **JsonObject** getData(@PathVariable("data-type") String dataType);
}

@FeignClient(name = "ABC")
public interface TestDataProviderApi {
   @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    **Object** getData(@PathVariable("data-type") String dataType);
}

@FeignClient(name = "ABC")
public interface TestDataProviderApi {
   @GetMapping(value = "/v1/path/{data-type}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    **JSONObject** getData(@PathVariable("data-type") String dataType);
}

没有任何效果。任一响应都打印为 {} 或 JSON 异常。但是在服务 A 日志中,它返回了正确的 JSON,例如 {"a":1}。如何处理价值?最终目标是读取 feign 客户端的响应并使用 Jayway JsonPath 获取价值。

提前致谢!

【问题讨论】:

  • 你不能返回一个 ResponseEntity

标签: spring-boot gson microservices feign


【解决方案1】:

Spring boot 默认使用 jackson 序列化-反序列化。由于返回的对象是 gson 类型,因此添加以下属性可以接收类型为 JsonObject 的正确响应。

spring.http.converters.preferred-json-mapper=gson

但这会影响其他控制器和客户端行为,因为一切都开始期待 gson 对象(无法反序列化 JSONObjects)。

相反,在 feign 客户端将返回类型标记为 Object 并在服务层使用类型转换,Gson() 帮助。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2020-01-02
    • 2019-07-27
    • 1970-01-01
    • 2018-02-12
    • 2019-05-17
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多