2013-09-16 4 views
2

Я использую клиент CXF JAXWS для получения некоторой информации из внешних веб-служб. Итак, в основном, у нас есть файлы .xsd и .wsdl из внешнего и пытаются реализовать нашего пользователя ws, создавая клиентские заглушки, используя cxf-codegen-plugin. Мы не можем изменить файлы .xsd и .wsdl. Все работает отлично, мы можем отправлять и извлекать мыльные сообщения из внешних служб. Однако, когда я просматриваю сообщение с запросом на мыло из журнала, я нахожу много неиспользуемых пространств имен в сообщении мыла (тела), посланном от нашего ws-клиента. Ниже приведен примерУдалить исходящие неиспользуемые пространства имен из сообщения мыла

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:aheaderns="http://xxx.xxx.xxx.xxx/header.xsd"> 
<soap:Header> 
    ... 
</soap:Header> 
<soap:Body> 
    <ns7:requestQuery xmlns:ns15="http://xxx.xxx.xxx.xxx/AAA" xmlns:ns14="http://xxx.xxx.xxx.xxx/BBB" xmlns:ns13="http://xxx.xxx.xxx.xxx/DDD" xmlns:ns12="http://xxx.xxx.xxx.xxx/CCC" xmlns:ns11="http://xxx.xxx.xxx.xxx/EEE" xmlns:ns10="http://xxx.xxx.xxx.xxx/FFF" xmlns:ns9="http://xxx.xxx.xxx.xxx/GGG" xmlns:ns8="http://xxx.xxx.xxx.xxx/HHH" xmlns:ns7="http://xxx.xxx.xxx.xxx/III" xmlns:ns6="http://xxx.xxx.xxx.xxx/JJJ" xmlns:ns5="http://xxx.xxx.xxx.xxx/KKK"> 
     <ns7:sample> 
      <ns7:type>A</ns7:type> 
      <ns7:ref>1</ns7:ref> 
     </ns7:sample> 
    </ns7:requestQuery> 
</soap:Body> 

Есть ли способ, чтобы удалить неиспользуемые пространства имен из исходящего мыльных отправок сообщения от клиента?

ответ

2

Вы можете перенести свои прокси-классы клиента в один и тот же пакет и сопоставить его с предлагаемым пространством имен, указанным в wsdl. Поместите этот код в класс package-info.java:

@XmlSchema(xmlns = { @XmlNs(prefix = "ns1", namespaceURI = "http://xxx.xxx.xxx") }, 
      namespace = "http://xxx.xxx.xxx") 
package clinet.sample.proxy; 

import javax.xml.bind.annotation.XmlNs; 

Надеется, что это помогает.

+0

Благодарим за отзыв. Я попытаюсь посмотреть, работает ли это решение. Тем не менее, я бы предпочел не изменять какие-либо из сгенерированных источников, поскольку процесс создания и развертывания войны ночной смысл означает, что каждую ночь клиентские заглушки будут автоматически генерироваться и упаковываться в банку и войну. Из-за этого я не могу изменить сгенерированный файл package-info.java. Есть ли другой способ удаления этих повторяющихся пространств имен? – papokk

+0

Вы можете установить имя пакета в 'extraargs' вашего' CxF-Codegen-plugin' конфигурации в 'pom' файл, например так: ' \t \t \t \t \t \t \t \t -p \t \t \t \t \t \t \t \t \t \t clinet.sample.proxy \t \t \t \t \t \t \t \t \t ' –

+0

Благодарим вас за рекомендацию. Я попытался изменить класс package-info в соответствии с вашими рекомендациями, к сожалению, дубликаты пространств имен по-прежнему остаются неизменными.Если вы можете сказать мне, в чем причина, почему неиспользуемые пространства имен были сгенерированы, я был бы признателен. Спасибо :) – papokk

0

После того, как вы решили в какой-то момент решить эту проблему, я нашел решение. Тем не менее, я думаю, что мое решение заключается не в том, чтобы решить проблему по первопричине, но сейчас она работает.

В основном, я использую XSLTOutInterceptor из CXF, чтобы применить XSL к выходному сообщению. Тем не менее, фаза PRE_STEAM по умолчанию для меня не работает. Затем я решил расширить XSLTOutInterceptor, чтобы изменить его PHASE на WRITE. Таким образом, неиспользуемые пространства имен будут удалены во время написания сообщения протокола перед его отправкой.

XSL я использую от how to remove unused namespaces from source xml

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

Спасибо :)

Смежные вопросы