8

我正在使用 Feign 编写一个 REST 客户端。有一个端点可以通过参数化路径来概括。但根据路径,我可以获得不同类型的响应。

所以我试图使用使用泛型的单一方法。由于我必须在返回类型上告诉方法,我正在参数化返回值的类型,如下所示,

@RequestLine("GET /objects/{type}/{model_id}")
public <T> Entity<T> getObject(
            @Param("type") String theObjectType, @Param("model_id") String theModelId,
            Class<T> theResponseClass);

但问题是,Feign 会theResponseClass用作 body。我怎样才能实现一个通用的 feign 客户端方法?

4

2 回答 2

1

您可以只使用 Feigns 的通用 Response 类型。遗憾的是它不是类型安全的,需要将正文作为 inputStream 或 byte[] 返回。

像这样:

  @RequestLine("GET /objects/{type}/{model_id}")
  public Response getMyData(@Param("model_id") String theModelId)
  {
    return Response.Builder.body(response).build();
  }
于 2021-03-16T11:10:16.927 回答
0

当涉及到通用响应时,总是很难让 Feign 返回通用响应,您唯一的选择是定义字符串响应,然后使用 mapstruct 映射它:

 @RequestLine("GET /objects/{type}/{model_id}")
    String getObject(@Param("type") String theObjectType, @Param("model_id") String theModelId);

然后在一个实用程序类中定义,如:

public final class JsonUtils {

private JsonUtils() {

}

 @SneakyThrows
public static <T> T jsonToObject(final String jsonString, final Class<T> clazz) {
    final ObjectMapper objectMapper = buildObjectMapper();
    return objectMapper.readValue(jsonString, clazz);
}

 public static ObjectMapper buildObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
    objectMapper.registerModule(new ParameterNamesModule());
    objectMapper.registerModule(new Jdk8Module());
    objectMapper.registerModule(new JavaTimeModule());
    return objectMapper;

}

}

于 2021-11-28T17:32:06.653 回答