使用 ParameterizedTypeReference 为 HttpRequestExecutingMessageHandler 设置 ExpectedResponseType

Using ParameterizedTypeReference to setExpectedResponseType for HttpRequestExecutingMessageHandler

我正在尝试使用 HttpRequestExecutingMessageHandler 配置网关。我面临的问题是 setExpectedResponseType 到通用类型。

当你直接使用 RestTemplate 时,我找到了一些解决方案,但是当通过 HttpRequestExecutingMessageHandler 处理配置时,我无法让它调用正确的 exchange 接收 ParameterizedTypeReferenceRestTemplate 方法。

这是示例代码:

我的通用 class:

   public class ListWrapperModel<T> {

   public ListWrapperModel() {}
   private List<T> list;
}

我的 HttpRequestExecutingMessageHandler 配置:

    Map<String, Expression> uriVariableExp = getDefaultEndpointProperties();
    SpelExpressionParser parser = new SpelExpressionParser();
    uriVariableExp.put("id", parser.parseExpression("payload"));

    String endpoint = "{host}/models?id={id}";
    HttpRequestExecutingMessageHandler gateway;

    gateway = new HttpRequestExecutingMessageHandler(endpoint, getRestTemplate());
    gateway.setRequiresReply(true);
    gateway.setHttpMethod(HttpMethod.GET);
    gateway.setExpectedResponseType(new ParameterizedTypeReference<ListWrapperModel<Model>>(){}.getClass());
    gateway.setUriVariableExpressions(uriVariableExp);

    return gateway;

这是我尝试过的一种方案,另一种方案是这样做的:

gateway.setExpectedResponseType(new ParameterizedTypeReference<ListWrapperModel<Model>>(){}.getType().getClass());

但是没用。

调试 HttpRequestExecutingMessageHandler,我注意到当它试图确定预期类型时,return 类型是:com.host.app.service.gateway.http.ServiceConfiguration

我是 java 的新手,但我假设 是创建的匿名类型。

请问有没有什么方法可以配置这样才能正常工作。

谢谢!

我设法通过使用响应类型值表达式解决了问题。以下设置对我有用:

ParameterizedTypeReference<ListWrapperModel<Model>> type = new ParameterizedTypeReference<ListWrapperModel<Model>>() { };
gateway.setExpectedResponseTypeExpression(new ValueExpression<>(type));

值表达式稍后将计算为提供的 ParameterizedTypeReference,基础 RestTemplate 将使用它来转换结果。