更改使用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

回到顶部