Spring WS управляет Custom FAult - PullRequest
0 голосов
/ 10 января 2012

Я справляюсь со своей ошибкой мыла, используя рецепт: http://www.stevideter.com/2009/02/18/of-exceptionresolvers-and-xmlbeans/

Часть кода, которая преобразует (используя преобразование идентичности - без XSLT) XML в подробности ошибки мыла:

protected void customizeFault(MessageContext messageContext, Object endpoint, Exception ex, SoapFault soapFault) {
  Transformer trn = null;
  Result result = null;
  SoapFaultDetail faultDetail = null;
  try {
    trn = TransformerFactory.newInstance().newTransformer();
    faultDetail = soapFault.addFaultDetail();

    // detail contains org.apache.xmlbeans marshalled xml
    StreamSource detail = ...
    result = faultDetail.getResult();
    trn.transform(detail, result); 
  ...
}

Когда я тестирую вывод с помощью SoapUI, я получаю ошибки проверки схемы, потому что ответ:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>SOAP-ENV:Server</faultcode>
      <faultstring xml:lang="en">it.fault.InputFault</faultstring>
      <detail>
        <inputFault xmlns="http://fault.my.it">
          <code>ERR-INPUT 003</code>
          <message>Dati in input non completi</message>
        </inputFault>
      </detail>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

У моего XSD нет elementFormDefault, поэтому unqualified и ответ должен выглядеть следующим образом:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>SOAP-ENV:Server</faultcode>
      <faultstring xml:lang="en">it.fault.InputFault</faultstring>
      <detail>
        <inputFault xmlns="http://fault.my.it">
          <code xmlns="">ERR-INPUT 003</code>
          <message xmlns="">Dati in input non completi</message>
        </inputFault>
      </detail>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Результат должен совпадать с маршалированным объектом xmlnbeans и содержать xmlns="".

Может кто-нибудь помочь мне понять, почему преобразование удалило объявления xmlns?

Спасибо.

1 Ответ

1 голос
/ 12 января 2012

ТАК ... Благодаря Grzegorz Grzybek я обнаружил, что xalan.jar не работал так хорошо, если он у вас есть в каталоге, «одобренном» Jboss 4.2, и вы компилируете с Java 1.5.Решение состоит в том, чтобы загрузить xalan-2.7.1.jar и установить его вместе с xalan. Все должно работать нормально, чтобы xmlns = "" было включено в SoapREsponse, например:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
  <SOAP-ENV:Fault>
     <faultcode>SOAP-ENV:Server</faultcode>
     <faultstring xml:lang="en">it.my.fault.InputFault</faultstring>
     <detail>
        <inputFault xmlns="http://my.it/version-1-0-0">
           <codice xmlns="">ERR-INPUT 003</codice>
           <messaggio xmlns="">Dati in input non completi</messaggio>
        </inputFault>
     </detail>
    </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
 </SOAP-ENV:Envelope>
...