web服务中的java/soapfault问题

web服务中的java/soapfault问题,java,xml,web-services,dom,jax-ws,Java,Xml,Web Services,Dom,Jax Ws,我有以下问题: 我将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<

我有以下问题: 我将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>
它是打印的:
详细信息值为空
有详细信息
详细信息:null-
节点值:null
有人能帮忙吗?为什么我不能获得SOAP故障的详细信息?它是否包含在SOAP消息中

更新:正确打印代码和错误字符串。

代码:S:Server
FaultString:java.lang.NullPointerException


感谢对于DOM元素,方法
getNodeValue
将始终返回
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"));
            }
        }
    }
}

您的示例没有显示detail元素在ns2:frame元素中是否有任何文本内容。您是否尝试过使用
getChildElements
或任何dom方法访问DetailEntry的childnodes?@Jorn:我明白您的意思。故障详细信息似乎报告了服务器中的堆栈跟踪(已更新post)。尝试使用getChildElements时,我进入了while循环,但打印了null值。我在帖子中也更新了代码谢谢。一旦我测试了它,我会让你知道它是否有效?或者有人可以帮助在Java1.8RT.jar上获取调试该程序的源代码
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"));
            }
        }
    }
}