当前位置:编程学习 > JSP >>

关于SOAP反序列化的一点认识,正好解释了问题所在

答案:看了一段关于反序列化的代码,原来在从xml代码到java代码的时候,有一个重新构造的过程,Apache Soap用的是org.apache.soap.encoding.soapenc.BeanSerializer来完成这个工作的.一个java 类是被看作一个bean来处理,重新构造时需要调用set方法,如果没有set方法,或者为private的时候,那么就等于构造了一个空的对象,所以造成了在客户端为空的现象.其实从服务端返回的不为空,只是本地重新构造时出了问题.下面的代码没有用apache默认得反序列化类,而是自己实现的,没有用到set.

public Bean unmarshall(String inScopeEncStyle, QName elementType,
  Node src, XMLJavaMappingRegistry xjmr, SOAPContext ctx)
  throws IllegalArgumentException
  {
    Element root = (Element)src;
    Element tempEl = DOMUtils.getFirstChildElement(root);
    samples.addressbook2.Phone target;

    try
    {
      target =
        (samples.addressbook2.Phone)samples.addressbook2.Phone.class.newInstance
        ();
    }
    catch (Exception e)
    {
      throw new IllegalArgumentException("Problem instantiating bean: "
        + e.getMessage());
    }

    while (tempEl != null)
    {
      Bean paramBean = xjmr.unmarshall(inScopeEncStyle,
      RPCConstants.Q_ELEM_PARAMETER,
      tempEl, ctx);
      Parameter param = (Parameter)paramBean.value;
      String tagName = tempEl.getTagName();


      if (tagName.equals("areaCode"))
      {
        target.areaCode_Elem = ((Integer)param.getValue()).intValue();
      }

      if (tagName.equals("exchange"))
      {
        target.exchange_Elem = (java.lang.String)param.getValue();
      }

      if (tagName.equals("number"))
      {
        target.number_Elem = (java.lang.String)param.getValue();
      }


      tempEl = DOMUtils.getNextSiblingElement(tempEl);
    }

    return new Bean(samples.addressbook2.Phone.class, target);
  }

上一个:Java+XML学习Step by step(一)
下一个:Apache Xerces

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,