我有一个对象图,其中一个访问器方法返回一个 java Optional,因此我的 XPath 表达式从该点开始停止。
xpath 是 data/someData[1]/optionalObject/field
如何让 JXPath 返回实际对象而不是 Optional,或者 JXPath 是否早于 java Optionals,所以它永远不会工作?
如果有人感兴趣,我通过创建自定义 NodePointerFactory 实例解决了 Optional 对象的问题。我找不到任何关于这样做的文档,但我希望下面的内容也能帮助遇到这个问题的任何人。
步骤如下。
通过调用注册实例
JXPathContextReferenceImpl.addNodePointerFactory(new OptionalHandlerPointerFactory());
实施
私有静态类 OptionalHandlerPointerFactory 实现 NodePointerFactory {
@Override
public int getOrder() {
//Insert before the bean pointer factory
return BeanPointerFactory.BEAN_POINTER_FACTORY_ORDER - 1;
}
@Override
public NodePointer createNodePointer(QName name, Object bean, Locale locale) {
if(bean != null && bean instanceof Optional) {
if(!((Optional)bean).isPresent()) {
return new NullPointer(name, locale);
}
final Object beanObject = ((Optional)bean).get();
final Class beanClass = beanObject.getClass();
JXPathBeanInfo bi = JXPathIntrospector.getBeanInfo(beanClass);
return new BeanPointer(name, beanObject, bi, locale);
}
return null;
}
@Override
public NodePointer createNodePointer(NodePointer parent, QName name, Object bean) {
if(bean != null && bean instanceof Optional ) {
if(!((Optional)bean).isPresent()) {
return new NullPointer(parent, name);
}
final Object beanObject = ((Optional)bean).get();
final Class beanClass = beanObject.getClass();
final JXPathBeanInfo bi = JXPathIntrospector.getBeanInfo(beanClass);
return new BeanPointer(parent, name, beanObject, bi);
}
return null;
}
}