Генерация пользовательского префикса пространства имен с помощью CXF/JAXB (сначала WSDL)
Я перевожу веб-сервис с Weblogic на JBoss. Один из существующих клиентов использует синтаксический анализатор, который чувствителен к используемым префиксам пространства имен, и я не могу повлиять на это. Миграция изменила некоторые префиксы, и мне нужно иметь возможность отменить их.
Я посмотрел на различные варианты, многие из которых исходят из этого ответа, но ни один не кажется подходящим.
Я использую cxf-codegen-plugin
и генерировать мои источники из WSDL. Это, кажется, лишает меня возможности добавлять аннотации к моим источникам.
Я также не использую Spring с CXF (поскольку это не приложение Spring, и я развертываю его на JBoss, который использует CXF изначально), поэтому у меня нет варианта, описанного в документации CXF об использовании jaxws:dataBinding
(или если у меня есть такая опция, я не понимаю, как ее настроить).
Я видел по крайней мере один пример JAXB на основе кода, который устанавливает свойство маршаллера, но не вижу, как это сделать декларативно.
Мой вызов JAXB уже включает в себя пользовательский bindings.xml
для картирования dateTime
типов (по унаследованным причинам, связанным с существующим кодом), и я ожидал, что что-то в том же духе будет возможно, но я не смог найти его.
Кто-нибудь имеет представление о том, как это можно сделать, учитывая эти ограничения?
1 ответ
Используйте SOAPHandler и укажите как handlerchain
в веб-сервисе.
@HandlerChain(file="/handler-chain.xml")
public class WebserviceImpl {
handler-chain.xml (внутри WEB-INF/classes
)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee">
<handler-chain>
<handler>
<handler-name>NamespacePrefixHandler</handler-name>
<handler-class>com.my.package.CustomHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
Воплощать в жизнь handleMessage()
чтобы получить мыльный конверт и установить префикс, как вы хотите.
final SOAPMessage soapMessage = context.getMessage();
final SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
final SOAPBody soapBody = soapMessage.getSOAPBody();
soapEnvelope.setPrefix("my");
soapEnvelope.removeNamespaceDeclaration("soap");
removeNSprefix(soapBody.getChildElements());
soapBody.setPrefix("my");