所以,我有一个http出站网关,它调用一个返回JSON数组的给定RESTful端点。
<int-http:outbound-gateway id="shipments"
http-method="GET"
expected-response-type="java.util.List"
url="http://codeserver.net/shipments?order={orderId}">
<int-http:uri-variable name="orderId" expression="payload.
</int-http:outbound-gateway>
如您所见,我为预期结果的类型指定了原始类型。底层GSON转换器(Jackson也是如此)最终会返回一个地图列表。我想弄清楚的是,是否有一种方法可以指定集合中泛型类型的性质。
我无法弄清楚如何指定基础ParameterizedTypeReference
可以使用的RestTemplate
,以便返回的列表对象属于List<Shipment>
类型而不是现在它将其映射到List<Map<String,Object>>
。
似乎没有办法在这里处理泛型。
有趣的是json-to-object-transformer
似乎也遇到了同样的问题。
有没有人知道在与HTTP网关进行这种类型的集成时如何处理泛型类型,还是我不得不求助于编写我自己的变换器以获得如此基本的东西?
答案 0 :(得分:2)
你指出了正确的JIRA票。从我们的测试看起来像:
expected-response-type-expression="T (org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandlerTests).testParameterizedTypeReference()"
它引用此方法的地方:
public static ParameterizedTypeReference<List<String>> testParameterizedTypeReference() {
return new ParameterizedTypeReference<List<String>>() {};
}
当然,static
类型的任何ParameterizedTypeReference
字段都可以。
从另一方面,您可以将所需的ParameterizedTypeReference
值填充到标题之前,并将其用作:
expected-response-type-expression="headers.expectedResponseType"
根据bean
,您甚至可以根据某些方法返回适当类型的requestMessage
。
JsonToObjectTransformer
可以做类似的事情,但结果取决于JSON引擎。有JsonHeaders
JsonToObjectTransformer
,当没有提供target-class
值时,new ParameterizedTypeReference<List<Shipment>>() {}
会与之交易。
<强>更新强>
正如您所注意到我们受限于XML定义,当我们无法指定泛型类型时甚至无法从SpEL中获取内联实现时:
<int:header-enricher>
<int:header name="expectedResponseType">
<int-groovy:script>
<![CDATA[
new ParameterizedTypeReference<List<com.my.proj.domain.Shipment>>() {}
]]>
</int-groovy:script>
</int:header>
</int:header-enricher>
根本不在SpEL工作。
我看到了使用内联脚本的XML定义的解决方法,例如Groovy:
{{1}}
答案 1 :(得分:1)
我有类似的问题,但基于Java的配置。我用
解决了这个问题org.springframework.integration.expression.ValueExpression
这是我配置的一部分
ParameterizedTypeReference<List<String>> reference = new ParameterizedTypeReference<List<String>>() {};
httpRequestExecutingMessageHandler.setExpectedResponseTypeExpression(new ValueExpression(reference));