更改使用JAXWS生成的默认XML名称空间前缀
我正在使用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
前缀来生成客户端?是否有
来设置此信息?
谢谢!
回答:
也许对您来说太晚了,我不确定是否可行,但是您可以尝试。
首先,您需要实现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());
以上是 更改使用JAXWS生成的默认XML名称空间前缀 的全部内容, 来源链接: utcz.com/qa/397895.html