Создание пользовательского префикса пространства имен с помощью CXF/JAXB (сначала WSDL)

Я переношу веб-сервис с Weblogic на JBoss. Один из существующих клиентов использует синтаксический анализатор, чувствительный к используемым префиксам пространств имен, и я не могу на это повлиять. Миграция изменила некоторые префиксы, и мне нужно иметь возможность вернуть их.

Я рассмотрел различные варианты, многие из которых взяты из этого ответа, но ни один из них не кажется подходящим. .

Я использую cxf-codegen-plugin и генерирую свои источники из WSDL. Кажется, это лишает меня возможности добавлять аннотации к моим источникам.

Я также не использую Spring с CXF (поскольку это не приложение Spring, и я выполняю развертывание в JBoss, который изначально использует CXF), поэтому у меня нет варианта, описанного в документация CXF по использованию jaxws:dataBinding (или, если у меня есть этот параметр, я не понимаю, как его настроить).

Я видел как минимум один пример JAXB на основе кода, который устанавливает свойство marshaller, но не может понять, как это сделать декларативно.

Мой вызов JAXB уже включает пользовательский bindings.xml для сопоставления dateTime типов (по устаревшим причинам, связанным с существующим кодом), и я ожидал, что что-то в том же духе будет возможно, но я не смог его раскопать.

Кто-нибудь знает, как это можно сделать, учитывая эти ограничения?


person Andy McKibbin    schedule 15.02.2018    source источник
comment
Вы ищете что-то вроде этого cxf.apache.org/docs/transformationfeature.html ?   -  person Karthik Prasad    schedule 15.02.2018
comment
Веб-сервисы SOAP или REST?   -  person ulab    schedule 15.02.2018
comment
@KarthikPrasad да, это может быть вариант, но JBoss не дает мне доступа к свойствам Spring, насколько я могу судить: docs.jboss.org/author/display/JBWS/Apache+CXF+интеграция   -  person Andy McKibbin    schedule 15.02.2018
comment
Веб-сервисы @ulab SOAP   -  person Andy McKibbin    schedule 15.02.2018
comment
Вам не нужен spring для настройки выше.   -  person Karthik Prasad    schedule 16.02.2018
comment
@KarthikPrasad, да, я верю, что это правда. Дело в том, что я не могу понять, как это сделать без Spring, но декларативно (т.е. без написания кода для установки свойства JAXB marshaller).   -  person Andy McKibbin    schedule 17.02.2018


Ответы (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(), чтобы получить soapenvelope, и установите нужный префикс.

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");
person ulab    schedule 19.02.2018