微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用WebService 出现org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it

 

  1。如果出现这个异常时, 首先要确定你的 webservice 传入参数是对象还是别的, 如果是对象的话, 就说明你传入的对象有关联的对

 

象没有被序列化,比如说, 你的传入对象 java B , 这个java  B 与 Java A 有关联, 例如 B 中引用了  A , 但是你只传入了 B 的

 

class 到 webservices,这是,必须将你的 A 对象也序列化后,客户端调用 webservice 时, 会将 A 序列化后返回到客户端, 下面给出个简单的事例:

 

    TypeMappingRegistry registry = service.getTypeMappingRegistry();  
        TypeMapping mapping = registry.createTypeMapping();  
        registerBeanMapping(mapping,B.class,new QName("nameSpaceUrl","请求名称"));  
        registerBeanMapping(mapping,C.class,"相应名称"));  
        registerBeanMapping(mapping,A.class,"A 的名称"));  
        registry.register("http://schemas.xmlsoap.org/soap/encoding/",mapping); 

        mapping.register(type,qname,new BeanSerializerFactory(type,qname),  
        new BeanDeserializerFactory(type,qname));
    }

 

 

 2。 一般情况下上述代码可以解决这个报错, 如果还是不行的话, 请检查你的客户端调用版本和服务器端webservice 版本是否一些,

 

本人就吃过一次亏,服务器端使用 axis2 生成的服务, 我用 axis 调用,也会报如上错误, 因为 axis2 在传入、传出参数的时候做了一些

 

序列化的处理, 所以如果使用 axis2 生成的服务, 需要使用 RPCServiceClient 的方式来调用。 下面给出一个简单的事例:

 

         /** 
     * 调用WebServices方法
     * <p> 
     *  调用WebService服务端的方法 
     * </p> 
     * @author liubb
     * @throws AxisFault
     * @throws Exception 
     */ 
    public static String invokeGetGreeting(String value,String wsdlUrl,String nameSpace,String methodName) throws AxisFault
    {  
      String returnStr = "" ;  // 返回参数
     
      // 使用RPC方式调用WebService  
         RPCServiceClient rpcServiceClient = new RPCServiceClient();  
         Options options = rpcServiceClient.getoptions();  
        
         OMElement om = null;
        
         // 指定调用WebService的URL  
         EndpointReference to = new EndpointReference(wsdlUrl);  
         options.setTo(to);  
        
         // 指定方法返回值的数据类型的Class对象  
         Class[] classes = new Class[]{String.class};  
        
         // 指定要调用方法及WSDL文件的命名空间  
         QName opAddEntry = new QName(nameSpace,methodName);
        
         // 指定getGreeting方法的参数值  
         Object[] opAddEntryArgs = new Object[]{value}; 
        
         om = rpcServiceClient.invokeBlocking(opAddEntry,opAddEntryArgs);

         returnStr = om.toString();
        
         return returnStr ;
    }  

 

 

   要使用 下面事例进行调用 axis2 的话, 则需要加载 axis2 中的 jar 包, jar 引用如下:

 

 axiom-api-1.2.7.jar

 axiom-impl-1.2.7.jar

 axis2-adb-1.4.1.jar

 axis2-kernel-1.4.1.jar

 backport-util-concurrent-3.1.jar

 commons-codec-1.3.jar

 neethi-2.0.4.jar

 stax-api-1.0-2.jar

 wstx-asl-3.2.4.jar

 XmlSchema-1.4.3.jar

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐