У нас есть чтение клиента Axis2 из веб-службы SOAP; проблема возникла, когда новые классы заглушки клиента были сгенерированы с использованием WSDL2JAVA, и их пакеты были переименованы. Сам инструмент генерации не вызывает проблемы, но WSDL2JAVA не переименовывает пакеты для всех классов, поэтому мне нужно сделать это самостоятельно.Исключения пользовательских сервисов выбрасываются как AxisFault
Любая идея о лучшем способе переименования пакетов для этих классов без проблем? Как, например, сделать замену строк разумным способом?
В некоторых случаях веб-служба бросает бизнес-исключения, и они попадают непосредственно в вызывающий код, однако этого больше не происходит, а вместо SPECIALException клиент теперь ловит AxisFault.
Вы можете увидеть ответ XML ниже:
<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Exception message, due to business error.</faultstring>
<detail>
<ns2:SPECIALException
xmlns:ns2="http://com.bla.com/common/exception/xsd/2008/08">
<ns2:code>7</ns2:code>
<ns2:message>Exception message, due to business error.</ns2:message>
</ns2:SPECIALException>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Проверку это более подробно, то разница, вероятно, из-за метод populateFaults в сформированном Bla ServiceStub классе, где имена классов устанавливаются в качестве строк для позже использование через отражение.
если есть с сервера. Вы можете проверить со стороны команды сервера, чтобы проверить, что не так в вашей обработке запроса. Не забудьте поделиться с ними XML-файлами запросов и ответов. – Salman
Это не с сервера, получается: если я создаю новый код с помощью WSDL2JAVA, все будет работать. Но мне нужно переименовать пакет, используя -p 'packageName' переименовывает только некоторый класс, и переименование пакетов для большего количества классов приводит к тому, что исключение снова станет AxisFault. –
Я не знаю глубоко Axis2, но в Axis 1, когда вы сгенерировали классы из wsdl, он сгенерировал также файлы wsdd; в этих файлах вы также можете найти определение пакета; вы проверяли, есть ли файлы после генерации кода? вы проверяли содержимое файла? В любом случае я считаю, что самый простой способ генерации классов - использовать задачу Ant, предоставленную Axis –