2016-02-13 6 views
0

возможно в JAX-WS для генерации атрибутов xmlns вместо префиксов?Пространство имен JAX-WS в атрибуте, а не префикс

Пример: объект A из пакета myns.a содержит некоторые объекты B1, B2 из пакета myns.b. Сформирован SOAP сообщение:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="urn:myns/a" xmlns:b="urn:myns/b"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <a:A1> 
     <b:B1>123456</b:B1> 
     <b:B2>abc</b:B2> 
     </a:A1> 
    </soapenv:Body> 
</soapenv:Envelope> 

Однако, мне нужно создать его таким образом (так Приставка б должны быть удалены и все объекты из пакета myns.b должны иметь атрибут XMLNS):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="urn:myns/a"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <a:A1> 
      <B1 xmlns="urn:myns/b">123456</B1> 
      <B2 xmlns="urn:myns/b">abc</B2> 
     </a:A1> 
    </soapenv:Body> 
</soapenv:Envelope> 

Есть простой способ, как справиться с этим? Например, на уровне package-info.java?

+0

Эти два фрагмента XML эквивалентны (в терминах пространств имен). [Так в чем же проблема?] (Http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Seelenvirtuose

+0

Да, я знаю. Но я отправляю это сообщение SOAP на сервер, который не может обрабатывать элементы (внутри: A1) с префиксами. – mrq

+0

Тогда - действительно - этот сервер должен быть исправлен. Извините, если это вам не поможет, но попытка обойти что-то действительно не подходит в некоторых случаях. – Seelenvirtuose

ответ

0

Я решил это с помощью пользовательского SOAPHandler и удалил префиксы из элемента в пространстве urn: myns/b.

упрощенный фрагмент:

@Override 
public boolean handleMessage(SOAPMessageContext context) { 

    SOAPBody body = context.getMessage().getSOAPPart().getEnvelope().getBody(); 

    //do recursivelly, this is just example 
    Iterator iter = body.getChildElements(); 
    while (iter.hasNext()) { 
    Object object = iter.next(); 

    if (object instanceof SOAPElement) { 
     SOAPElement element = (SOAPElement) object; 

     if("urn:myns/b".equals(element.getNamespaceURI())){ 
     element.setPrefix(""); 
     }  
    } 
}