Обработка Java Необязательно в иерархии объектов JXPath? - PullRequest
0 голосов
/ 31 января 2019

У меня есть граф объектов, и один из методов доступа возвращает java Необязательный, и в результате мое XPath-выражение останавливается с этого момента.

xpath - это data / someData [1] / optionObject / field

Как я могу заставить JXPath возвращать фактический объект, а не Optional или JXPath до даты java Optional, и поэтому он никогда не будет работать?

1 Ответ

0 голосов
/ 01 февраля 2019

Если кому-то интересно, я решил проблему с необязательными объектами, создав собственный экземпляр NodePointerFactory.Я не смог найти никакой документации по этому вопросу, но я надеюсь, что нижеприведенное поможет всем, кто сталкивается с этой проблемой.

Шаги следующие:

  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;
    }       
    

    }

...