当输入列表为空时,Camel Splitter具有自己的bean无法正常工作

时间:2014-07-24 11:40:18

标签: apache-camel

我有一个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 []

发送有效数据时效果很好。 知道问题是什么吗?

由于

0 个答案:

没有答案