2014-09-23 21 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