java - 属性中的 JAX-WS 命名空间,而不是前缀

标签 java xml soap jax-ws jax-ws-customization

在 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 级别?

最佳答案

我使用自定义 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("");
      }       
   }
}

关于java - 属性中的 JAX-WS 命名空间,而不是前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35382457/

相关文章:

java - 无法找到或加载主类文件

java - 在连接之前,我如何告诉 SSLSocket 所需的 key 输入的别名?

java - 在 JPanel 内滚动 JFrame

java - XmlPullParser "eventType"表示什么?

xml - 删除 scala 中的前缀属性 (scala-xml)

php - 读取 Soap Response XML 并插入到 mysql 中

java - 找不到类型为 : class com. spring.mvc.model.User 的返回值的转换器

java - 从按钮获取输入的 Android 单行 textView(用于计算器应用程序),这是一个问题吗?

Java Web 服务请求-响应问题

PHP SoapClient SSL 连接超时错误