编程语言
首页 > 编程语言> > java-通用类型和HTTP出站网关结果

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