我正在尝试使用 HttpRequestExecutingMessageHandler
配置网关。我面临的问题是将 setExpectedResponseType
设置为通用类型。
当你直接使用 RestTemplate
时,我找到了一些解决方案,但是当通过 HttpRequestExecutingMessageHandler
处理配置时,我无法让它调用正确的方法RestTemplate
的 exchange
方法接收 ParameterizedTypeReference
。
这是示例代码:
我的通用类:
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,我注意到当它试图确定预期类型时,返回类型是:com.host.app.service.gateway.http.ServiceConfiguration$1
我是 java 的新手,但我假设 $1
是创建的匿名类型。
请问有没有什么办法可以配置这样才能正常工作。
谢谢!
最佳答案
我设法通过使用响应类型值表达式解决了这个问题。以下设置对我有用:
ParameterizedTypeReference<ListWrapperModel<Model>> type = new ParameterizedTypeReference<ListWrapperModel<Model>>() { };
gateway.setExpectedResponseTypeExpression(new ValueExpression<>(type));
值表达式稍后将被评估为提供的 ParameterizedTypeReference
,底层 RestTemplate
将使用它来转换结果。
关于java - 使用 ParameterizedTypeReference 为 HttpRequestExecutingMessageHandler 设置 ExpectedResponseType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238183/