我有以下问题: 我将 SAAJ 用于 Web 服务。我的 SOAPMessage 有以下 soap 错误:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>java.lang.NullPointerException</faultstring>
<detail>
<ns2:exception xmlns:ns2="http://jax-ws.dev.java.net/" class="java.lang.NullPointerException" note="To disable this feature, set com.sun.xml.internal.ws.fault.SOAPFaultBuilder.disableCaptureStackTrace system property to false">
<ns2:stackTrace>
<ns2:frame class="myClass" file="HandlerFile.java" line="261" method="invoke" /><ns2:frame class="myClass" file="HandlerFile.java" line="1" method="invoke" /><ns2:frame class="com.sun.xml.internal.ws.api.server.InstanceResolver$1" line="unknown" method="invokeProvider" /></ns2:stackTrace>
</ns2:exception>
</detail>
</S:Fault>
</S:Body>
</S:Envelope>
但如果我试图获取详细信息,我什么也得不到!
我是这样做的:
String code = soapMsg.getSOAPBody().getFault().getFaultCode();
String faultString = soapMsg.getSOAPBody().getFault().getFaultString();
Detail detail = reply.getSOAPBody().getFault().getDetail();
if(detail == null)
System.out.println("No detail");
else
System.out.println("Detail value is "+detail.getNodeValue());
Iterator it = reply.getSOAPBody().getFault().getDetail().getDetailEntries();
StringBuilder details = new StringBuilder();
details.append("Detail:");
while(it.hasNext())
{
System.out.println("Has details");
DetailEntry temp = (DetailEntry) it.next();
System.out.println(temp.getTextContent());
System.out.println(temp.getValue());
details.append(temp.getValue());
details.append("-");
Iterator it2 = temp.getChildElements();
while(it2.hasNext())
{
Node t = (Node) it2.next();
System.out.println("Node value:"+t.getNodeValue());
}
}
System.out.println("Details:"+details.toString());
打印出来的是:
详细信息值为 null
有详情
详情:null-
节点值:null
有人可以帮忙吗?为什么我无法获取 SOAP 错误的详细信息?它包含在 SOAP 消息中?
更新:代码和故障字符串打印正确。
即
code:S:Server
故障字符串:java.lang.NullPointerException
谢谢
最佳答案
getNodeValue
方法将始终为 DOM 元素返回 null
,getTextContent
会更好,但在您的情况下,所有信息都包含在属性中嵌套元素。您将不得不使用如下代码遍历这些嵌套元素。请注意,我还没有测试代码。
String uri = "http://jax-ws.dev.java.net/";
QName qnException = new QName(uri, "exception");
QName qnStackTrace = new QName(uri, "stackTrace");
QName qnFrame = new QName(uri, "frame");
SOAPFault fault = soapMsg.getSOAPBody().getFault();
System.out.println("code=" + fault.getFaultCode());
System.out.println("faultString=" + fault.getFaultString());
for (Iterator i=fault.getDetail().getDetailEntries(); i.hasNext(); ) {
DetailEntry detailEntry = (DetailEntry)i.next();
for (Iterator j=detailEntry.getChildElements(qnException); j.hasNext(); ) {
SOAPElement exception = (SOAPElement)j.next();
System.out.println("exception class=" + exception.getAttribute("class"));
for (Iterator k=exception.getChildElements(qnStackTrace); k.hasNext(); ) {
SOAPElement stackTrace = (SOAPElement)k.next();
for (Iterator l=stackTrace.getChildElements(qnFrame); l.hasNext(); ) {
SOAPElement frame = (SOAPElement)l.next();
System.out.println(" class=" + frame.getAttribute("class"));
System.out.println(" file =" + frame.getAttribute("file"));
}
}
}
}
关于Web服务中的java/soapfault问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4032048/