0

可以在 JAX-WS 中生成 xmlns 属性而不是前缀吗?

示例:myns.a 包中的对象 A 包含 myns.b 包中的一些对象 B1、B2。生成的 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>

但是,我需要以这种方式生成它(因此应删除前缀 b 并且包 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 级别?

4

1 回答 1

1

我使用自定义 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("");
      }       
   }
}
于 2016-02-13T18:38:17.160 回答