1、xfire中\org\codehaus\xfire\jaxws下类与jdk jar包冲突
删除掉jaxws
2、xfire的静态调用改cxf,要改成cxf的动态调用(否则不通)
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//注册WebService接口
factory.setServiceClass(HrmService.class);
//设置WebService地址
factory.setAddress("http://10.5.104.37:88//services/HrmService");
HrmService hsi = (HrmService)factory.create();
s = hsi.SynHrmResource(ip,orgxml);
System.out.println(s);
/*以上代码替换成 =======================================================
*/
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://10.5.104.37:88//services/HrmService?wsdl");
Object[] objects = client.invoke("SynHrmResource", new Object[]{ip,orgxml});
System.out.println("Echo response: "+ objects[0]);
3、axis客服端传对象参数,服务器端要定义支持
package cn.com.chenlly.ssh.webservice.axis;
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
public class WSTestServiceClient {
public static void main(String[] args) {
Service service = new Service();
try {
Call call = (Call) service.createCall();
String url = "http://192.168.1.98:8082/SSHProject/services/ws?wsdl";
call.setTargetEndpointAddress(new java.net.URL(url));
//定义对象
Address address = new Address();
address.setIdentifier(1);
address.setProvince("湖南");
address.setCity("长沙");
address.setExst(false);
//第一个参数名字空间URI,第二个参数本地部分,注意这两部分在server-config.wsdd文件中标签beanMapping配置 urn:AddressManager 是服务器端定义的
QName qn = new QName("urn:AddressManager", "Address");
call.registerTypeMapping(Address.class, qn,
new BeanSerializerFactory(Address.class, qn),//序列化
new BeanDeserializerFactory(Address.class, qn));
call.setOperationName(new QName(url,"dealAddress"));
call.addParameter("arg0", qn, ParameterMode.IN);//定义一个参数类型,如果是String类型的参数可以不需要这句话
call.setReturnClass(Address.class);//指定返回类型
Address result = (Address) call.invoke(new Object[]{address});//这里传递给service的是一个对象
System.out.println(result.isExst());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
org.apache.axis.client.Service service = new Service();
//生成客户端
org.apache.axis.client.Call call = (Call)service.createCall();
//设置url(注意需要生成一个net 包下的URL对象而不是字符串
call .setTargetEndpointAddress(new URL(url字符串));
//设置是否使用SoapAction
call .setUseSOAPAction(true);
//设置SoapAction路径一般我发布服务类的的全路径名倒叙加上发布的方法
call.setSOAPActionURI(targetNamespace+method);
//设置targetNamespace 和 method;
call.setOperationName(targetNamespace ,method);
//设置请求参数(根据服务端需要的参数设置例如需要一个参数名为Name的String类型)IN为输入 out 为输出 INOUT为输入输出
call.addParameter(new QName(targetNamespace, "Name"),
org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);
//设置返回数据类型(SOAP_VECTOR为数组具体类型自行百度)
call.setReturnType(org.apache.axis.encoding.XMLType.SOAP_VECTOR);
//调用webService获得返回的数据 转入一个Object[]数组,数组的元素就是转入参数的值
Object invoke = createCall.invoke(new Object[]{"harry"});
*/
}
4、cxf客服端调用方法
//1、静态调用
// 创建WebService客户端代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 判断是否抛出异常
factory.getOutInterceptors().add(new LoggingInInterceptor());
// 注册webservice接口 DeductionService类头上要加@webservice
factory.setServiceClass(DeductionService.class);
// 配置webservice地址
factory.setAddress("http://localhost:7002/card/services/HelloWorld?wsdl");
// 获得接口对象
CxfService service = (CxfService) factory.create();
// 调用接口方法
String result = service.sayHello("aaaaaaaaaa");
System.out.println("调用结果:" + result);
// 关闭接口连接
System.exit(0);
//2、动态调用
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
// url为调用webService的wsdl地址
org.apache.cxf.endpoint.Client client = dcf
.createClient("http://localhost:7002/card/services/HelloWorld?wsdl");
// namespace是命名空间,methodName是方法名
QName name = new QName("http://dao.xcf.digitalchina.com/", "sayHello");
// paramvalue为参数值
String xmlStr = "aaaaaaaa";
Object[] objects;
try {
objects = client.invoke(name, xmlStr);
System.out.println(objects[0].toString());
} catch (Exception e) {
e.printStackTrace();
}
/*静态调用需要依赖service类,因为客户端调用cxf webservice接口的过程中需要服务器端提供service,很不方便,
如果同一个项目中则没有区别。
动态调用完全不依赖service类,服务器端只要提供接口名和路径就可以方便的调用。*/