最近在做ws的开发与对接,发现对接的客户发送的请求不带命名空间,而且还没有办法要求对方带命名空间。
所以只能在服务端来想办法了。
刚开始在网上找下,发现其他同学也有同样的问题,但是没有发现有优雅的解决办法。而且cxf2.X和3.X版本对命名空间的
强制要求还不一样。例如:使用cxf2.X版本,服务端不做任何额外配置,就可以支持“客户发送的请求不带命名空间”。cxf3.X
不做一些额外配置,就玩不转了。
现将跳坑的结果记录下,项目使用的是cxf3.X,需要添加一个服务端拦截器。代码如下:
public class ServerNameSpaceInterceptor extends AbstractPhaseInterceptor<Message> {
public ServerNameSpaceInterceptor()
{
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message) throws Fault {
for (ServiceInfo si : message.getExchange().getService().getServiceInfos()) {
si.setProperty("soap.force.doclit.bare",true); //这个就是忽略客户端不带命名空间的关键
}
}
}
服务端发布时添加拦截器代码如下:
public class HelloServiceMain {
public static void main(String[] args) {
String address = "http://127.0.0.1:7777/test";
EndpointImpl ep = (EndpointImpl)Endpoint.publish(address,new HelloServiceImpl());
ep.getInInterceptors().add(new ServerNameSpaceInterceptor());
System.out.println("发布消息成功");
}
}