如何将泛型类型作为交换输入体而非铸造?

时间:2016-08-28 06:00:42

标签: java spring apache-camel

Apache camel 中,通过将其类型传递给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
            }
        }
    }
}

我们的期望与示例一样。

1 个答案:

答案 0 :(得分: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
            }
        }
    }
}

如果您不自己创建地图列表,您应该小心这种方法 - 您可能需要提供适当的转换器