Я справляюсь со своей ошибкой мыла, используя рецепт:
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
?
Спасибо.