使用 ParameterizedTypeReference 为 HttpRequestExecutingMessageHandler 设置 ExpectedResponseType
Using ParameterizedTypeReference to setExpectedResponseType for HttpRequestExecutingMessageHandler
我正在尝试使用 HttpRequestExecutingMessageHandler
配置网关。我面临的问题是 setExpectedResponseType
到通用类型。
当你直接使用 RestTemplate
时,我找到了一些解决方案,但是当通过 HttpRequestExecutingMessageHandler
处理配置时,我无法让它调用正确的 exchange
接收 ParameterizedTypeReference
的 RestTemplate
方法。
这是示例代码:
我的通用 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
将使用它来转换结果。
我正在尝试使用 HttpRequestExecutingMessageHandler
配置网关。我面临的问题是 setExpectedResponseType
到通用类型。
当你直接使用 RestTemplate
时,我找到了一些解决方案,但是当通过 HttpRequestExecutingMessageHandler
处理配置时,我无法让它调用正确的 exchange
接收 ParameterizedTypeReference
的 RestTemplate
方法。
这是示例代码:
我的通用 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
将使用它来转换结果。