2016-08-28 34 views
2

阿帕奇駱駝它有可能通過將它的類型傳入exchange.getIn().getBody(Class<T> type)來獲得它自己的類型的消息正文。比方說,我們想要獲得郵件正文爲String這裏的例子如下:如何將泛型類型作爲交換輸入體而不是投射?

String body = exchange.getIn().getBody(String.class); 

GenericParameterized類型的消息,我們如何通過它自己的類型,而不是傳統的對象類型轉換獲取對象的情況。這裏爲您實現的僞代碼片段:

package com.chorke.hmis.fusion.epoint; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.apache.camel.Exchange; 
import org.springframework.stereotype.Component; 

@Component("chorkeProcessor") 
public class ChorkeProcessorImpl implements ChorkeProcessor{ 

    @Override 
    public void process(Exchange exchange) throws Exception { 
     ArrayList<HashMap<String, Object>> list = null; 
     list = exchange.getIn().getBody(ArrayList<HashMap<String, Object>>.class); 

     for (HashMap<String, Object> map : list) { 
      for (String key : map.keySet()) { 
       Object value= map.get(key); 
       //TODO 
      } 
     } 
    } 
} 

我們的期望與示例相同。

+0

可能重複[Apache駝峯getbody作爲自定義類](http://stackoverflow.com/questions/34607811/apache-camel-getbody-as-custom-類) – shmosel

回答

2

它根本無法完成,沒有ArrayList<HashMap<String, Object>>.class類,該類始終是簡單的ArrayList.class,這就是Java通用類型的工作原理。你要麼必須使用純ArrayList

@Component("chorkeProcessor") 
public class ChorkeProcessorImpl implements ChorkeProcessor{ 

    @Override 
    public void process(Exchange exchange) throws Exception { 
     ArrayList<HashMap<String, Object>> list = exchange.getIn().getBody(ArrayList.class); 

     for (HashMap<String, Object> map : list) { 
      for (String key : map.keySet()) { 
       Object value= map.get(key); 
       //TODO 
      } 
     } 
    } 
} 

或定義和使用自己的類型,只是擴展ArrayList<HashMap<String, Object>>

// MyListOfMaps.java 
public class MyListOfMaps extends ArrayList<HashMap<String, Object>> { 
    // constructors, additional methods 
} 

// ChorkeProcessorImpl.java 
@Component("chorkeProcessor") 
public class ChorkeProcessorImpl implements ChorkeProcessor{ 

    @Override 
    public void process(Exchange exchange) throws Exception { 
     MyListOfMaps list = exchange.getIn().getBody(MyListOfMaps.class); 

     for (HashMap<String, Object> map : list) { 
      for (String key : map.keySet()) { 
       Object value= map.get(key); 
       //TODO 
      } 
     } 
    } 
} 

你應該小心使用這種方法,如果你不創建你可能需要提供一個合適的轉換器

+0

對於第一種情況,必須添加'@通過public void process(Exchange exchange)的SuppressWarnings(「unchecked」)'拋出Exception'方法來避免編譯時警告。第二個看起來不錯,但要避免聲明任何包裝類。有任何匿名課程會更好。 –

+1

「沒有ArrayList >。class class」 - >實際上,您可以使用TypeToken創建這樣的類(https://github.com/google/guava/wiki/ReflectionExplained#typetoken) ,但我不知道駱駝是否支持這種方式。 –

+1

恐怕你不能這樣做,TypeToken只是一個抽象,它允許你做Java本身不支持的事情,但TypeToken不是一個類,不能在需要類的地方使用 –

相關問題