如何从骆驼XPathBuilder XPath表达式获取Java Date对象?

时间:2018-08-08 08:39:57

标签: xpath apache-camel

我有一个使用Camel的XPathBuilder在处理器bean中创建和评估xpath表达式的程序。

我已经创建了对象

XPathBuilder xpath = XPathBuilder.xpath( "path/to/dateElement", java.util.Date );

并执行它

Object obj = xpath.evaluate( exchange, Object.class );

但是,当我记录obj的值时,它为null。如果我将其请求为字符串,则它将返回XML日期格式的字符串,正如我期望的那样。

XPathBuilder不支持转换为java.util.Date吗? (我在任何地方的文档中都看不到受支持的输出类的列表。)

我尝试将xpath表达式显式转换为xs:dateTime,但这给了我一个例外,它无法将表达式转换为nodeList。

(当我想要java.lang.Long或java.lang.Double而不是java.util.Date时,效果很好)

如何获取Xpath以返回Date对象?

谢谢!螺丝带。

1 个答案:

答案 0 :(得分:1)

在使用XPathBuilder时,不支持仅转换为NumberStringBooleanNodeNodeList框。如果要支持其他类型,则需要实现自定义Type Converter

import org.apache.camel.Converter;
import org.apache.camel.TypeConverters;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class XmlDateTypeConverters implements TypeConverters {

    @Converter
    public Date convertNodeToDate(Node node) throws ParseException {
        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX")
                .parse(node.getTextContent());
    }

    @Converter(allowNull = true)
    public Date convertNodeListToDate(NodeList nodeList) throws ParseException {
        if (nodeList.getLength()==0){
            return null;
        }
        return convertNodeToDate(nodeList.item(0));
    }
}

XmlDateTypeConverters向CamelContext的注册取决于您的偏好,对于Java DSL,它看起来像这样:

getContext().getTypeConverterRegistry().addTypeConverters(new XmlDateTypeConverters())

在春季,TypeConverter是自动发现的(如果是bean)。