客户端和服务端使用的axis2 1.5,测试的时候发现字段顺序不一致,wsdl2java生成的本地代码字段顺序也不一致,客户端访问时抛异常unexpected subelement xxx各位这种问题有没有遇到的,怎么解决,多谢

解决方案 »

  1.   

    代码比较多,就是比较普通的一个web service。顺序不一致按理说不会影响,但是确实出现了问题
      

  2.   

    一般WebService客户端对字段的返回顺序不应该有要求吧?如果你很想字段顺序一样。自己一下Axis的源代码咯。在org.apache.axis2.description.java2wsdl.DefaultSchemaGenerator.java中找一下
    将PropertyDescriptor[] properties = beanInfo.getPropertyDescriptors()句代码,
    后面增加
    Arrays.sort(properties, new Comparator<PropertyDescriptor>() {
    public int compare(PropertyDescriptor o1, PropertyDescriptor o2) {
    return o1.getName().compareTo(o2.getName());
    }
    });
    这样就保证按名称顺序了。
      

  3.   

    was上wsdl输入参数部分:
     <xs:complexType name="MsgInOutParam">
     <xs:sequence>
      <xs:element minOccurs="0" name="seqn" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="errMsg" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="sndr" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="dttm" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="errNo" nillable="true" type="xs:int" /> 
      <xs:element minOccurs="0" name="length" nillable="true" type="xs:int" /> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="msgs" nillable="true" type="ax25:SimpleAngelMessage" /> 
      </xs:sequence>
      </xs:complexType>
    ------------
    tomcat上wsdl输入参数部分:
     <xs:complexType name="MsgInOutParam">
     <xs:sequence>
      <xs:element minOccurs="0" name="dttm" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="errMsg" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="errNo" nillable="true" type="xs:int" /> 
      <xs:element minOccurs="0" name="length" nillable="true" type="xs:int" /> 
      <xs:element maxOccurs="unbounded" minOccurs="0" name="msgs" nillable="true" type="ax26:SimpleAngelMessage" /> 
      <xs:element minOccurs="0" name="seqn" nillable="true" type="xs:string" /> 
      <xs:element minOccurs="0" name="sndr" nillable="true" type="xs:string" /> 
      </xs:sequence>
      </xs:complexType>
    ---------------------
    如果使用was上的wsdl生成本地代码,然后调用tomcat上的服务就会报如下错误:
    Sending Data Error: org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement errMsg客户端代码如下:
    public class WSGetMsgListBasicTester
    {
    private static String strCheckpoint;

        final Logger log = Logger.getLogger(this.getClass());    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        
    public static void main(String[] args) {
    // TODO 实现方法体
    WSGetMsgListBasicTester wsTester = new WSGetMsgListBasicTester();

    wsTester.log.info("wsTester Test begins.");
    wsTester.testHandle("test","test","");
    wsTester.log.info("wsTester Test Ends.");
    }
        
        public void testHandle(String id, String password, String msgXML) 
        {
            HubMessageServiceStub hubMessageServiceStub = null;
            try
            {
                hubMessageServiceStub = new HubMessageServiceStub("http://172.22.6.80:8080/test/services/hubMessageService.hubMessageServiceHttpSoap12Endpoint");
                
            }
            catch(Exception e)
            {
               log.error(e);
            }
            hubMessageServiceStub._getServiceClient().getOptions().setSoapVersionURI(org.apache.axiom.soap.SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
            hubMessageServiceStub._getServiceClient().getOptions().setTimeOutInMilliSeconds(5*60*1000);
            GetMsgList getMsgList = new GetMsgList();
            HubMessageServiceStub.MsgRequestParam msgRequestParam = new HubMessageServiceStub.MsgRequestParam();
            
            msgRequestParam.setId(id);
            msgRequestParam.setPassword(password);
            if(strCheckpoint == null)
            {
             strCheckpoint = sdf.format(new Date());
             msgRequestParam.setCheckpoint(strCheckpoint);
            
            }
            else
            {
             msgRequestParam.setCheckpoint(strCheckpoint);
            }   
            getMsgList.setReqParam(msgRequestParam);        GetMsgListResponse getMsgListResponse = null;
            
            try
            {
                getMsgListResponse = hubMessageServiceStub.getMsgList(getMsgList);
            }
            catch (Exception e)
            {
                log.info("Sending Data Error:"+" "+e);
            }
            HubMessageServiceStub.MsgInOutParam msgInOutParam = null;
            try
            {
             msgInOutParam = getMsgListResponse.get_return();
            }
            catch(Exception ex)
            {
             log.error(ex);
            }
            log.info("Begin get msg.--------------");
            if(msgInOutParam != null)
            {
             log.info("ErrNo:" + msgInOutParam.getErrNo());
             log.info("ErrMsg:" + msgInOutParam.getErrMsg());
            }
        } 
    }
      

  4.   

        经过测试发现,web service的返回参数是复杂对象时会出现该问题,复杂对象中有多个字段,was上生成的wsdl中字段顺序按照类型中的字母顺序排序,tomcat上wsdl中的字段按照字段的字母顺序排序。客户端解析时,是按照wsdl上的字段顺序解析的。顺序不一致的时候就会报错。
        有没有办法让客户端按照字段名称来解析,而不依赖与字段顺序。
        或者能不能限制wsdl的字段顺序,不管部署在什么服务器,顺序都一样。
      

  5.   

    http://blog.mpathirage.com/2009/08/04/reasons-for-unexpected-subelement-exception-in-axis2-data-bindingadb/
    你去这里看看 我google出来的  不过全英文的
      

  6.   

    to:colin_pxx
    好像不太相关啊我自己做过测试,随便写了一个简单的web service也有类似问题:
    服务端:
    package sky;import sky.model.InOutParam;public class HelloAxis2 {
    public InOutParam echo(InOutParam para) 
    {  
    System.out.println(">>>>> Service HelloAxis2: ");
    System.out.println("name:" + para.getStrName());
    System.out.println("password:" + para.getPassword());
    System.out.println("time:" + para.getNTime());
    return para;
    }
    }
    package sky.model;public class InOutParam {
    String strName;
    int password;
    String nTime;
    }
    客户端:
    package sky;import sky.SkyServiceStub.Echo;
    import sky.SkyServiceStub.EchoResponse;
    import sky.SkyServiceStub.InOutParam;public class TestHelloAxis2 {   public static void main(String[] args) throws Exception 
       {
       SkyServiceStub stub = new SkyServiceStub("http://172.34.12.57:9080/AxisWebServiceServer/services/skyService.skyServiceHttpEndpoint/");
       
       Echo request = new Echo();
       InOutParam inParam = new InOutParam();
       inParam.setStrName("sky");
       inParam.setPassword(1);
       inParam.setNTime("time");
       request.setPara(inParam);
       EchoResponse response;
       response = stub.echo(request);
       InOutParam outParam = response.get_return();
       System.out.println("Response : " + outParam.getNTime());
       }
    }
      

  7.   

    建议先写wsdl文件,然后方向生成server端.
      

  8.   

    楼主,这个问题有办法解决了吗?
    我也遇到这样的问题,不知道怎么解决。
    如果楼主已经解决了,请告诉我解决办法吧,万分感谢!
    邮箱:[email protected]
      

  9.   

    Caused by: org.apache.axis2.databinding.ADBException: Unexpected subelement out我也出现相同的问题,是顺序次序问题导致的?
      

  10.   

    用BCB开发JAVA AXIS2的Web Service接口发现Unexpected subelement异常错误,网上没找到类似终极解决方法,顶楼主,看谁能解决了。分享一下。谢谢