CXF的客户端传对象时报参数不匹配

错误:

java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.cxf.databinding.AbstractWrapperHelper.createWrapperObject(AbstractWrapperHelper.java:99)

解决方法:实例化需要传输的对象时,对象的包路径必须与应用默认生成客户端类的包路径一致。


初始化cxfwebservice,系统默认生成webserviceclient(1),及对应的类(2)

wsdl2java -client -d /data/gsmpro/bookExam/.cxftmp/src -classdir /data/gsmpro/bookExam/build/classes -p http://impl.cxf.example.com/=com.example.cxf.impl -impl -validate -exsh false -dns true -dex true -wsdlLocation http://127.0.0.1:8080/cxfserverexample/cxfservlet/datatypes?wsdl -verbose -defaultValues -fe jaxws -db jaxb -wv 1.1 http://127.0.0.1:8080/cxfserverexample/cxfservlet/datatypes?wsdl

系统默认生成客户端的包为:com.example.cxf.impl

Created classes: com.example.cxf.impl.CreateDataTypes, com.example.cxf.impl.CreateDataTypesResponse, com.example.cxf.impl.DataTypes, com.example.cxf.impl.GetDataTypes, com.example.cxf.impl.GetDataTypesResponse, com.example.cxf.impl.ObjectFactory

若对应的目录com.example.cxf.impl已存在DataTypes对象,则该对象优先实例化;否则应用自动生成的DataTypes对象为准


代码一

JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();
Client client = dynamicClient.createClient(wsdl);
Object dataTypes = Thread.currentThread().getContextClassLoader().loadClass("com.example.cxf.impl.DataTypes").newInstance();
Method m2 = dataTypes.getClass().getMethod("set_boolean", boolean.class);
Method m3 = dataTypes.getClass().getMethod("set_bytes", byte[].class);
Method m4 = dataTypes.getClass().getMethod("set_date",Date.class);
Method m5 = dataTypes.getClass().getMethod("set_double", double.class);
Method m6 = dataTypes.getClass().getMethod("set_float", float.class);
Method m7 = dataTypes.getClass().getMethod("set_int", int.class);
Method m8 = dataTypes.getClass().getMethod("set_long", long.class);
Method m9 = dataTypes.getClass().getMethod("set_string", String.class);

m2.invoke(dataTypes, false);
m3.invoke(dataTypes, new String("字节数组").getBytes("UTF-8"));
m4.invoke(dataTypes, new Date());
m5.invoke(dataTypes, 1.23d);
m6.invoke(dataTypes, 1.111f);
m7.invoke(dataTypes, 11);
m8.invoke(dataTypes, 11111l);
m9.invoke(dataTypes, "字符串");
Object result = client.invoke("createDataTypes",new Object[]{dataTypes})[0];
Assert.assertEquals("1", result.toString());


代码二

注,DataTypes对象必须在com.example.cxf.impl包下;与系统默认生成的包目录对应一致。

DataTypes dataTypes = new DataTypes();
dataTypes.set_boolean(false);
dataTypes.set_bytes(new String("字符数组").getBytes("UTF-8"));
dataTypes.set_date(new Date());
dataTypes.set_double(1.111d);
dataTypes.set_float(1.222f);
dataTypes.set_int(11);
dataTypes.set_long(1322L);
dataTypes.set_string("字符串");
Object result = client.invoke("createDataTypes",new Object[]{dataTypes});
Assert.assertEquals("1", result.toString());


代码三(查看参考)

注:DataTypes对象系统默认生成的包目录不一致。

JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
factoryBean.setAddress(wsdl);
factoryBean.setServiceClass(IDataTypesOperator.class);
dataTypesOperator = (IDataTypesOperator) factoryBean.create();
DataTypes dataTypes = new DataTypes();
dataTypes.set_boolean(false);
dataTypes.set_bytes(new String("字符数组").getBytes("UTF-8"));
dataTypes.set_date(new Date());
dataTypes.set_double(1.111d);
dataTypes.set_float(1.222f);
dataTypes.set_int(11);
dataTypes.set_long(1322L);
dataTypes.set_string("字符串");
String result = dataTypesOperator.createDataTypes(dataTypes);
Assert.assertEquals("1", result);



参考:Apache CXF实战之三 传输Java对象


版权声明:本文为suigui1000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。