Как перехватить ответ мыльной ошибки для неверных данных в запросе?
Я могу успешно зарегистрировать запрос и ответ на действительный запрос мыла (класс, сгенерированный с помощью wsimport), но не смог перехватить содержимое xml при возникновении исключения (когда узел в запросе заполнен недопустимыми данными). Я мог бы получить детали ответа, но я хочу захватить только часть XML необработанного ответа. Я пробовал SOAPFaultException, но он выдает только сообщение об исключении, а не полный конверт с телом ответа. Как перехватить исключение, используя только содержимое xml в исключении / ошибке.
Примечание. Я знаю, что могу проанализировать ошибку (необработанный ответ) и извлечь содержимое xml, но мне интересно, есть ли простой способ / способ получения содержимого xml, как показано ниже. Контент должен выглядеть следующим образом (ответ получен из инструмента Soap UI)
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
<env:Header xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/08/addressing/fault</wsa:Action>
<wsa:MessageID>urn:uuid:xyz</wsa:MessageID>
<wsa:RelatesTo>urn:uuid:xyz</wsa:RelatesTo>
<wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To>
</env:Header>
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Sender</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">The 'http://www.fakexyz.com/schemas/xyz:xyz' element is invalid - The value '123' is invalid according to its datatype 'String' - The Pattern constraint failed.
Please revise your data fields and make sure that message is correctly formatted.</soap:Text>
</soap:Reason>
<detail>
<faulttype>Schema</faulttype>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
1 ответ
Изучив больше и попробовав, я обнаружил, что нам нужен класс, который должен реализовывать интерфейс SoapHandler, это дает вам в значительной степени то, что нужно. Я переопределил метод handleFault, как показано ниже.
public boolean handleFault(SOAPMessageContext context) {
System.out.println("==============================================RESPONSE(ERROR)=======================================\r\n");
String[] abc= context.get(MessageContext.HTTP_RESPONSE_HEADERS).toString().split("],");
for(String httpheader:abc) {
System.out.println(httpheader+"],");
}
System.out.println("\r\n");
SOAPMessage message= context.getMessage();
try {
Source source = message.getSOAPPart().getContent();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "3");
transformer.transform(source, new StreamResult(System.out));
} catch (Exception e) {
System.out.println("Response has errors!!");
}
return false;
}
Это дало мне информацию об ошибке в форматированном xml, а также с заголовками http.