关于 No deserializer defined for array type这个问题真是困扰我好长的时间啊!!!耗费了太长的时间了!网上很多网友的解决方案是在server-config.wsdd文件的自配<service>中加入typemapping项,可是我加了还是不能解决!而且,我的本来的server-config.wsdd文件中已经有了
<beanMapping languageSpecificType="java:webservices.Book" qname="ns1:book" xmlns:ns1="http://127.0.0.1:8080/testWebService2/services/myService"/ >
在这里有个问题就是qname="ns1:book" ,book不是Book!!!!!!!!
我去掉typemapping,保留beanmapping!!!然后建立client测试,代码如下:
public
class
TestClient
...
{ public static void main(String[] args) ... { Service service = new Service(); try ... {
Call call = (Call)service.createCall(); QName qn = new QName( " http://127.0.0.1:8080/testWebService2/services/myService " , " book " ); call.registerTypeMapping(Book.class , qn, new BeanSerializerFactory(Book. class ,qn), new BeanDeserializerFactory(Book. class ,qn)); call.setTargetEndpointAddress( " http://127.0.0.1:8080/testWebService2/services/myService?wsdl " ); call.setOperationName( new QName( " http://127.0.0.1:8080/testWebService2/services/myService " , " show " )); Book[] books = (Book[]) call.invoke( new Object[] ... {} ); System.out.println(books); } catch (Exception e) ... { e.printStackTrace(); } } }
这里也要注意的是
QName qn
=
new
QName(
"
http://127.0.0.1:8080/testWebService2/services/myService
"
,
"
book
"
);
也要与配置文件server-config.wsdd中的对应,book也不是Book!!!!!然后就是注册对这个namespace命名的类进行加序列,解序列工厂类!!
QName qn
=
new
QName(
"
http://127.0.0.1:8080/testWebService2/services/myService
"
,
"
book
"
); call.registerTypeMapping(Book.
class
, qn,
new
BeanSerializerFactory(Book.
class
,qn),
new
BeanDeserializerFactory(Book.
class
,qn));
如果以上这些你都做了,还是出现标题中的异常的话,那么就要看看你的调用方法了,是不是把call.setOperationName写成了call.setOperation这两个方法差别是很大的哦!!!!关于源代码,我还没来得急钻研!!!各位,如果有碰到这个问题还没有解决的,可以借鉴一下的!应该就出了这些问题的!