Генерация пользовательского префикса пространства имен с помощью 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");
Другие вопросы по тегам