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] [オブジェクトである]スレッドセーフではありませんし、ないリエントラントによると
。
任意のアイデア?