-1

我有一个对象图,其中一个访问器方法返回一个 java Optional,因此我的 XPath 表达式从该点开始停止。

xpath 是 data/someData[1]/optionalObject/field

如何让 JXPath 返回实际对象而不是 Optional,或者 JXPath 是否早于 java Optionals,所以它永远不会工作?

4

1 回答 1

0

如果有人感兴趣,我通过创建自定义 NodePointerFactory 实例解决了 Optional 对象的问题。我找不到任何关于这样做的文档,但我希望下面的内容也能帮助遇到这个问题的任何人。

步骤如下。

  1. 通过调用注册实例

    JXPathContextReferenceImpl.addNodePointerFactory(new OptionalHandlerPointerFactory());

  2. 实施

    私有静态类 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;
    }       
    

    }

于 2019-02-01T12:23:25.017 回答