在 Apache camel 中,通过将其类型传递给exchange.getIn().getBody(Class<T> type)
,可以通过它自己的类型获取邮件正文。假设我们想要将消息正文设为String
,这里的示例如下:
String body = exchange.getIn().getBody(String.class);
如果是Generic
或Parameterized
类型的消息,我们如何通过它自己的类型而不是传统的对象类型转换来获取对象。这里是您实现的伪代码片段:
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 :(得分: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
}
}
}
}
如果您不自己创建地图列表,您应该小心这种方法 - 您可能需要提供适当的转换器