проблема Java / soapfault в веб-службах - PullRequest
2 голосов
/ 27 октября 2010

У меня следующая проблема: Я использую SAAJ для веб-сервисов. У меня есть сообщение 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());

напечатано:
Значение детализации ноль
Имеет детали
Подробности: * нуль- 1014 *
Значение узла: ноль
Может ли кто-нибудь помочь в этом? Почему я не могу узнать подробности ошибки SOAP? Включено в SOAP-сообщение?

ОБНОВЛЕНИЕ: код и строка ошибки напечатаны правильно.
* 1022 Т.е. * Код: S: Сервер
FaultString: java.lang.NullPointerException

Спасибо

1 Ответ

1 голос
/ 27 октября 2010

Метод getNodeValue всегда возвращает null для элемента DOM, 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"));
            }
        }
    }
}
...