我有一个routebuilder,它分割传入的json数组,将每个部分转换为XML并将其聚合回一个列表并将其传递给持久化的bean。 如下所示,我使用自己的bean来获取传入的json数组,将其拆分并返回List。
这是我的路线建设者:
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
XmlJsonDataFormat xmlJsonFormat = new XmlJsonDataFormat();
xmlJsonFormat.setForceTopLevelObject(true);
xmlJsonFormat.setRootName("Message");
from("direct:eventprocessor")
.split()
.method(MyMessageSplitter.class)
.aggregationStrategy(new EventListAggregator())
.unmarshal(xmlJsonFormat)
.end()
.bean(new EventCreator());
}
};
}
这是我的分割器实现:
@Handler
public List<Message> splitBody(String message) throws JsonProcessingException, IOException {
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(message);
List<Message> messageList = new ArrayList<Message>();
if (root.isArray()) {
for (final JsonNode jsonNode : root) {
DefaultMessage camelMessage = new DefaultMessage();
camelMessage.setBody(jsonNode.toString());
messageList.add(camelMessage);
}
}
return messageList;
}
这是我的聚合器实现:
public class EventListAggregator implements AggregationStrategy {
public EventListAggregator() {
super();
}
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
Message newIn = newExchange.getIn();
// add payload and headers to EsbEvent object
EsbEvent newBody = new EsbEvent(newIn.getHeaders(), newIn.getBody(String.class));
ArrayList<EsbEvent> list = null;
if (oldExchange == null) {
list = new ArrayList<EsbEvent>();
list.add(newBody);
newIn.setBody(list);
return newExchange;
} else {
Message in = oldExchange.getIn();
list = in.getBody(ArrayList.class);
list.add(newBody);
return oldExchange;
}
}
}
这里的问题: 当我的路由收到一个空的json列表时,调用分割器,按预期返回一个空List,但永远不会调用EventListAggregator。这导致以下问题:使用先前的有效负载调用以下bean(EventCreator),该有效负载是json字符串而不是列表。
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: java.lang.String to the required type: java.util.List with value []
发送有效数据时效果很好。 知道问题是什么吗?
由于