2011-08-29 5 views
0

xml要素を持つ要素をチェックしています(存在しない場合はデフォルト値になります)。WebSphereで2番目の呼び出しでノードを見つけることができないJAXP XPathのクエリ(JUnitは正常に動作します)

これは、Websphere 7上のJAXWSへのWebサービス呼び出しから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); 
} 

ご覧のとおり、私はそれぞれの呼び出すことができるほど多くをインスタンス化しています。

最初のWebサービスコールでは、ノードを戻して動作します。 2番目のWebサービス呼び出しでは、両方のxpathにnullが返されます。 javadoc「XPathの[とXPathExpression] [オブジェクトである]スレッドセーフではありませんし、ないリエントラントによると

任意のアイデア?

答えて

0

まあOK。 私は「 それを考え出しましたそれがうまく行われまし。

これ。まあ、正確には、それはラウンド 二度目のxpathのxpathだった。

私が短縮番目xパスは"//ns:Provider/ns:DeclarationDate"ns:Providerはルート)から"//ns:DeclarationDate"になります。

JAXPのWebSphere 7実装のどこかに欠陥がありますが、これは原因を調査している可能性があります。

これは将来的に誰かに役立つことを願っています。

関連する問題