Запрос JAXP XPath не может найти узел при втором вызове в WebSphere (JUnit работает нормально) - PullRequest
0 голосов
/ 30 августа 2011

Я проверяю элемент с элементом xml и по умолчанию будет иметь значение, если оно отсутствует.

Это происходит из-за вызова веб-службы в JAXWS на Websphere 7 как org.apache..xerces.dom.ElementNSImpl.

// instantiate xpath
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
xPath.setNamespaceContext(new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
    if ("ns".equals(prefix))
        return PROVIDER_NAMESPACE;
    else
        return XMLConstants.NULL_NS_URI;
    }
    public String getPrefix(String uri) {
        return null; // n/a
    }
    public Iterator<?> getPrefixes(String uri) {
        return null; // n/a
    }
});

// Check if date is populated
XPathExpression declarationDateXpath = xPath.compile("//ns:Provider/ns:DeclarationDate");
Node dateNode = (Node) providerDateXpath.evaluate(node, XPathConstants.NODE);
if (dateNode == null) {
    // if not there, add the node
    Document doc = node.getOwnerDocument();
    dateNode = doc.createElementNS(PROVIDER_NAMESPACE, "DeclarationDate");

    XPathExpression providerXPath = xPath.compile("//ns:Provider");    
    Node providerNode = (Node) providerXPath.evaluate(node, XPathConstants.NODE);
    providerNode.appendChild(dateNode);
}

// Check value & set default if necessary
if (dateNode.getTextContent() == null || "".equals(dateNode.getTextContent())) {
    // date not set, defaulting to today
    dateNode.setTextContent(today);
} 

Как вы можете видеть, я создаю все, как могу, каждый вызов.

Первый вызов веб-службы, он работает, возвращая узлы.Второй вызов веб-службы возвращает null для обоих путей xpath.

В соответствии с javadoc"XPath [и XPathExpression] [объекты] не поточнобезопасны и не реентерабельны.

Есть идеи?

1 Ответ

0 голосов
/ 01 сентября 2011

Ну хорошо. Я понял это Я заставил это работать.

Это был xpath. Ну, если быть точным, это был xpath второй раунд .

Я сократил xpath с "//ns:Provider/ns:DeclarationDate" (где ns:Provider - корень) до "//ns:DeclarationDate".

Где-то в реализации JAXP в WebSphere 7 будет дефект, который вызывает это, но дальнейшее исследование не представляется возможным / стоящим

Надеюсь, это поможет кому-то в будущем ...

...