2014-09-23 17 views
1

因此,我有一个http出站网关调用给定的RESTful端点返回一个JSON数组。泛型类型和HTTP出站网关结果

<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转换器(杰克逊也一样)最终返回了一张地图列表。我想知道的是,是否有方法在集合中指定泛型类型的性质。

我一直无法弄清楚如何指定ParameterizedTypeReference底层RestTemplate现在,它它映射到一个List<Map<String,Object>>使用以便列表对象返回BE List<Shipment>型的,而不是因为它。

似乎没有办法在这里处理泛型。

有趣的是json-to-object-transformer似乎也遭受同样的问题。

有没有人知道如何处理泛型类型时,这种类型的HTTP网关集成或将不得不求助于写我自己的变压器的东西这么基本?

+0

它看起来像吉拉为Spring集成包含有关如何做到这一点的一些信息。它看起来很丑陋。我不知道是否有更好的方法来做到这一点:[HttpRequestExecutingMessageHandler在执行expectedResponseTypeExpression时丢失了泛型](https://jira.spring.io/browse/INT-3052?jql = text%20〜%20%22Generic%20Type%20and%20expected-response-type%22) – 2014-09-23 23:26:39

回答

1

您指出了正确的JIRA票证。从我们的测试中,它看起来像:

expected-response-type-expression="T (org.springframework.integration.http.outbound.HttpRequestExecutingMessageHandlerTests).testParameterizedTypeReference()" 

凡引用了这种方法:

public static ParameterizedTypeReference<List<String>> testParameterizedTypeReference() { 
    return new ParameterizedTypeReference<List<String>>() {}; 
} 

当然也可以在任何staticParameterizedTypeReference类型。

从另一面可以填充的ParameterizedTypeReference期望值前的头,并用它作为:

expected-response-type-expression="headers.expectedResponseType" 

你甚至可以有一些bean可以从它的一些方法根据requestMessage返回适当的类型。

JsonToObjectTransformer可以做类似的事情,但结果取决于JSON引擎。有JsonHeaders,与没有target-class价值的JsonToObjectTransformer得到处理。

UPDATE

当你注意到我们正在与XML定义,当我们不能指定一个泛型类型,甚至不能从规划环境地政司privde内嵌实施限制:

new ParameterizedTypeReference<List<Shipment>>() {} 

没有按在SpEL中根本不工作。

我看到与嵌入式脚本XML定义的解决办法,比如Groovy:在

<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> 
+0

这正是我一直在寻找的。它看起来很难定义类型。例如,我不能使用'@ GatewayHeader',因为'ParameterizedTypeReference'实例不被认为是[Java常量表达式](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html #jls-15.28),我无法找到一种直接在XML中定义类型标记bean的方法,即使可能会看起来丑陋,因为在XML中,我必须转义'<' and '>'。不得不定义暴露类型的方法或字段并不是很好,但至少有一种方法。 – 2014-09-24 12:04:17

+1

查看我的回答更新 – 2014-09-24 12:10:42

+0

Groovy技巧真棒!我希望我能再次让你高兴。我真的不想在XML之外定义它。希望将来会有更简单的方法来做到这一点,但暂时来说,这将会有所斩获。 – 2014-09-24 12:13:04