2016-08-28 33 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不是一个类,不能在需要类的地方使用 –

相关问题