通用类型和HTTP出站网关结果

时间:2014-09-23 22:56:00

标签: java spring generics spring-integration

所以,我有一个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网关进行这种类型的集成时如何处理泛型类型,还是我不得不求助于编写我自己的变换器以获得如此基本的东西?

2 个答案:

答案 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));