使用JAVA调用.net WebService的终极解决方案
发现自己总是闭门造车,总是疏于整理与总结。下决心改变自己,从每件小事做起吧。共勉
?
最近做WebServices 比较多,和各种企业联调弄得楼主焦头烂额。其中,最郁闷的,还是与.net平台的对接。
?
楼主本地系统是Axis2 ,分别与Axis,Axis2与.net的接口来对接。
?
刚一开始采用的方案是基于采用本地发布的wsdl作为标准,使用Axis2工具生成Stub客户端来调用各企业接口。楼主一开始想当然的认为既然是发布的服务,应该遵守SOA的规范,那么通过生成的客户端,理应可以各种接口各种调。结果,残酷的事实证明,这样是行不通的。在采取客户端,调用Axis的服务时,发现了很尴尬的问题。使用本地的Stub,调用失败。
本地生成jibx Stub客户端方法如下:
?
/** * 根据传入的参数返回拼装好的 OMElement * @param omMap * @param nameSpace * @param action * @return */public OMElement getOmElement(Map<String, String> omMap, String action) {SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();OMElement child;OMElement wrapper = factory.createOMElement(action, namespace, "");Set<String> lableSet = omMap.keySet();Iterator<String> it = lableSet.iterator();while(it.hasNext()){String lable = it.next();child = factory.createOMElement(lable, namespace, "");child.setText(omMap.get(lable));wrapper.addChild(child);}return wrapper;}public String invoke(String action,OMElement wrapper) throws AxisFault {RPCServiceClient rpcClient = new RPCServiceClient();Options options = rpcClient.getOptions();EndpointReference targetEPR = new EndpointReference(endpoint);options.setTo(targetEPR);options.setAction(namespace + "/" + action);// 解决.net 调用java 调用不通时使用// options.setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED,Boolean.FALSE);OMElement response = rpcClient.sendReceive(wrapper);Object[] objects = BeanUtil.deserialize(response, new Class[] { String.class }, new DefaultObjectSupplier());return objects[0].toString();}?
其中,deserialize?是对response返回的消息进行反序列化,可以形成我们原来的返回消息格式
?
?经过三番五次的测试,.net和java纷纷落马~O~Ye~
?
楼主经验尚浅,说的肯定有很多不对或者不准确或者瞎掰的地方。只求将解决方案与大家共勉,希望大家不要吝啬,多提宝贵意见及问题。