答案:看了一段关于反序列化的代码,原来在从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