我现在在客户端调用服务端的方法,服务端的方法返回的是一个对象,这个方法里面包含一个对象数组
我现在调用的时候报错
org.xml.sax.SAXException: Found character data inside an array element while deserializing
public static void main(String[] args) {
System.err.print("调用远方webservice接口获取全部执收单位信息");
String res = "error";
try{
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL("http://tbyfsoft.vicp.net:8080/tbyfzwpt/admincenter/ws/SyncUnitInfo"));
call.setOperationName(new QName("http://ws.admincenter.tbyf.com", "syncUnitInfo"));
call.addParameter(new QName("http://ws.admincenter.tbyf.com","userId"),XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter(new QName("http://ws.admincenter.tbyf.com","unitCode"),XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter(new QName("http://ws.admincenter.tbyf.com","pwd"),XMLType.XSD_STRING,ParameterMode.IN);
call.setUseSOAPAction(true);  

call.setReturnType(new QName("http://ws.admincenter.tbyf.com",  
            "responce"), com.tbyf.nontax.POJO.QueryUnitInfoResponse.class); QName responce = new QName("http://tbyfsoft.vicp.net:8080/tbyfzwpt/admincenter/ws/SyncUnitInfo", "SyncUnitInfo");

QName info1 = new QName("http://tbyfsoft.vicp.net:8080/tbyfzwpt/admincenter/ws/SyncUnitInfo", "UnitInfo");
QName info2 = new QName("http://tbyfsoft.vicp.net:8080/tbyfzwpt/admincenter/ws/SyncUnitInfo", "ArrayOfUnitInfo");
 
call.registerTypeMapping(com.tbyf.nontax.POJO.QueryUnitInfoResponse.class, responce,  
                    new BeanSerializerFactory(com.tbyf.nontax.POJO.QueryUnitInfoResponse.class, responce),  
                    new BeanDeserializerFactory(com.tbyf.nontax.POJO.QueryUnitInfoResponse.class, responce));

call.registerTypeMapping(com.tbyf.nontax.POJO.UnitInfo.class, info1,  
                    new BeanSerializerFactory(com.tbyf.nontax.POJO.UnitInfo.class, info1),  
                    new BeanDeserializerFactory(com.tbyf.nontax.POJO.UnitInfo.class, info1));

call.registerTypeMapping(com.tbyf.nontax.POJO.UnitInfo[].class,info2,
new BeanSerializerFactory(com.tbyf.nontax.POJO.UnitInfo[].class, info2),
new BeanDeserializerFactory(com.tbyf.nontax.POJO.UnitInfo[].class, info2));
System.out.println(":::::::::::::  " );
com.tbyf.nontax.POJO.QueryUnitInfoResponse info = (com.tbyf.nontax.POJO.QueryUnitInfoResponse)call.invoke(new Object[]{"001","4213000658","71D064E47EDC7FD6"});
System.out.println("@@@@@@@@@  " );

System.err.println(info.getMsg());
} catch (Exception e){
System.err.println("\nWebServiceError: 获取执收单位信息失败");
e.printStackTrace();
}
}

解决方案 »

  1.   

    刚学的java web service,想请教下逆势这么开发的,用的什么工具?谢谢
      

  2.   

    数组和arrylist 需要自己序列化 和反序列化 单独的String[][] 我是这么设置的
    // 设置返回类型
    call.registerTypeMapping(String[].class, qn, new ArraySerializerFactory(), new ArrayDeserializerFactory());
    call.setReturnClass(String[][].class);
    这是个二维的
      

  3.   

    贴个完整的
    String endpoint = "http://localhost:2820/WebService1.asmx";
    Service service = new Service();
    Call call = (Call) service.createCall();
    call.setTargetEndpointAddress(new java.net.URL(endpoint)); // 要调用的方法名
    //call.setOperationName("HelloWorld");
    // 设置调用方法参数
    /*call.addParameter(new QName("http://localhost/", "manags"),
    org.apache.axis.encoding.XMLType.XSD_STRING,
    javax.xml.rpc.ParameterMode.IN);*/
    QName qn=new QName("http://localhost/", "HelloWorld");
    // 设置返回类型
    call.registerTypeMapping(String[].class, qn, new ArraySerializerFactory(), new ArrayDeserializerFactory());
    call.setReturnClass(String[][].class);
    call.setUseSOAPAction(true);
    call.setSOAPActionURI("http://localhost/HelloWorld"); // http://localhost/命名空间
    call.setOperationName(new javax.xml.namespace.QName(
    "http://localhost/", "HelloWorld")); Object resp=call.invoke(new Object[]{});
    System.out.println(resp);
    manags=(String[][])JavaUtils.convert(resp, String[][].class);