java-通用类型和HTTP出站网关结果
作者:互联网
因此,我有一个http出站网关,该网关正在调用给定的RESTful端点,该端点返回JSON数组.
<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转换器(杰克逊也是如此)最终返回了地图列表.我想弄清楚的是,是否有一种方法可以在集合中指定泛型类型的性质.
我还不能弄清楚如何指定基础RestTemplate可以使用的ParameterizedTypeReference,以便返回的列表对象的类型为List< Shipment>.而不是现在那样,它将其映射到List< Map< String,Object>>.
似乎这里没有办法处理泛型.
有趣的是,json-to-object-transformer似乎也遇到了同样的问题.
有谁知道在与HTTP网关进行这种类型的集成时如何处理通用类型,还是我不得不为如此基本的事情编写自己的转换器?
解决方法:
您指出了正确的JIRA机票.根据我们的测试,它看起来像:
expected-response-type-expression="T (org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandlerTests).testParameterizedTypeReference()"
它引用此方法的位置:
public static ParameterizedTypeReference<List<String>> testParameterizedTypeReference() {
return new ParameterizedTypeReference<List<String>>() {};
}
当然,它可以是任何具有ParameterizedTypeReference类型的静态字段.
从另一方面,您可以将ParameterizedTypeReference的所需值填充到标头之前,并将其用作:
expected-response-type-expression="headers.expectedResponseType"
您甚至可以包含一些bean,这些bean可以根据requestMessage从其某些方法返回适当的类型.
JsonToObjectTransformer可以执行类似的操作,但是结果取决于JSON引擎.有JsonHeaders,当没有提供的目标类值时,JsonToObjectTransformer会与之交易.
更新
如您所见,我们受XML定义的限制,当我们无法指定泛型类型甚至无法从SpEL继承内联实现时:
new ParameterizedTypeReference<List<Shipment>>() {}
在SpEL中根本不起作用.
我看到了内联脚本(例如Groovy)的XML定义的解决方法:
<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>
标签:generics,spring,java,spring-integration 来源: https://codeday.me/bug/20191121/2050209.html