当前位置: 首页 > 面试题库 >

更改使用JAXWS生成的默认XML名称空间前缀

谭铭
2023-03-14
问题内容

我正在使用JAXWS为正在构建的Java应用程序生成WebService客户端。

当JAXWS构建其XML以用于SOAP协议时,它将生成以下名称空间前缀:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Body ...>
       <!-- body goes here -->
   </env:Body>
</env:Envelope>

我的问题是,除非 我的 XML代理人(XML
namepspace前缀为soapenv),否则我的Counterpart(一家大型汇款公司)将管理我的客户端连接到的服务器,拒绝接受WebService调用(
请不要问我为什么 )。像这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body ...>
       <!-- body goes here -->
   </soapenv:Body>
</soapenv:Envelope>

所以我的问题是:

有没有一种方法可以命令JAXWS(或任何其他Java WS客户端技术)使用soapenv而不是env作为XMLNS前缀来生成客户端?是否有
API调用 来设置此信息?

谢谢!


问题答案:

也许对您来说太晚了,我不确定是否可行,但是您可以尝试。

首先,您需要实现SoapHandler,然后在handleMessage方法中可以修改SOAPMessage。我不确定是否可以直接修改该前缀,但是可以尝试:

public class MySoapHandler implements SOAPHandler<SOAPMessageContext>
{

  @Override
  public boolean handleMessage(SOAPMessageContext soapMessageContext)
  {
    try
    {
      SOAPMessage message = soapMessageContext.getMessage();
      // I haven't tested this
      message.getSOAPHeader().setPrefix("soapenv");
      soapMessageContext.setMessage(message);
    }
    catch (SOAPException e)
    {
      // Handle exception
    }

    return true;
  }

  ...
}

然后,您需要创建一个HandlerResolver

public class MyHandlerResolver implements HandlerResolver
{
  @Override
  public List<Handler> getHandlerChain(PortInfo portInfo)
  {
    List<Handler> handlerChain = Lists.newArrayList();
    Handler soapHandler = new MySoapHandler();
    String bindingID = portInfo.getBindingID();

    if (bindingID.equals("http://schemas.xmlsoap.org/wsdl/soap/http"))
    {
      handlerChain.add(soapHandler);
    }
    else if (bindingID.equals("http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/"))
    {
      handlerChain.add(soapHandler);
    }

    return handlerChain;
  }
}

最后,您必须将您HandlerResolver的服务添加到您的客户服务中:

Service service = Service.create(wsdlLoc, serviceName);
service.setHandlerResolver(new MyHandlerResolver());


 类似资料:
  • 问题内容: 我想使用JDOM读取XML文件,然后使用XPath从JDOM Document中提取数据。它可以很好地创建Document对象,但是当我使用XPath在Document中查询元素列表时,我什么也没得到。 我的XML文档在根元素中定义了一个默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行了XPath查询并返回了我想要的元素。要使XPath查询返回结果,我还必须做什么? XML:

  • 每当我在Android Studio中生成一个签名apk,默认情况下它给出的名称是app-release.apk... 我们是否可以做任何设置,以便它应该提示并询问我需要分配给apk的名称(在eclipse中这样做) 我所做的是-在apk生成后重命名它。这不会给出任何错误,但有没有任何真正的方式,使我可以做任何设置的改变,以获得提示。

  • 问题内容: 有没有一种方法可以在python ElementTree中定义默认/无前缀的命名空间?这似乎不起作用… 这也不是: 可以,但是我必须在每个元素前加上前缀: 在OSX上使用Python 3.5。 编辑:如果答案为“否”,您仍然可以获得赏金:-)。我只是想要一个花了很多时间使用它的人的明确“否”。 问题答案: 没有简单的方法可以透明地处理默认名称空间。正如您已经提到的,为空名称空间分配非空

  • 每当我在Android Studio中生成签名apk时,默认情况下,它会将名称app-release.apk.... 我们是否可以进行任何设置,以便它能够提示并询问需要分配给apk的名称(就像它在eclipse中所做的那样) 我要做的是——在生成apk后重命名它。这不会给出任何错误,但有没有真正的方法可以让我更改设置以获得提示。 注:

  • 问题内容: 我有一个使用默认名称空间打印的文件。元素以ns2前缀打印,我需要将其删除,以及与我的代码的关系: 我希望它是: 这就是我的编码方式,据我所知,这足以使ns2消失: 生成的package-info结果如下: 我创建如下文件: generateClassesPackage是其中package-info.java及其元素所在的包。 Foo对象已定义,并具有以下元素: 我错过了吗?还是我误解了

  • 问题内容: 我要对此文件执行XPath查询(显示的摘录): 这是我正在使用的代码的摘要: 我面临的问题是,在XPath查询中引用默认名称空间时,不会调用getNamespaceURI方法来解决它。例如,此查询不提取任何内容: 现在,我尝试通过用假前缀替换来“诱骗”解析器,然后相应地编写方法(以便在遇到问题时返回)。在这种情况下,将调用,但是XPath表达式求值的结果始终是一个空字符串。 如果我从文