axis2報錯:org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement XXXX
因爲wsimport命令生成的類是按照wsdl中字段的順序進行校驗的,所以當字段順序不一致或者請求中的字段在wsdl不存在時,均會報此錯誤。
修改生成的類中的Factory.parse(...)方法,去除多數字段的校驗,增加字段循環設值:
// --------------------zhaigx20131202
String fieldName = null;
String fieldVal = null;
QName qName = null;
while (reader.isStartElement()) {
qName = reader.getName();
fieldName = qName.getLocalPart();
nillableValue = reader.getAttributeValue(
"http://www.w3.org/2001/XMLSchema-instance", "nil");
if ("true".equals(nillableValue)
|| "1".equals(nillableValue)) {
throw new org.apache.axis2.databinding.ADBException(
"The element: " + fieldName
+ " cannot be null");
}
fieldVal = org.apache.axis2.databinding.utils.ConverterUtil
.convertToString(reader.getElementText());
MapperUtil.setPropertyVal(object, fieldName, fieldVal);
reader.next();// skip text
// skip other like space,tab
while (!reader.isStartElement() && !reader.isEndElement()) {
reader.next();
}
// move to next
if (reader.isEndElement()) {
reader.next();
}
}
// skip other like space,tab
while (!reader.isStartElement() && !reader.isEndElement()) {
reader.next();
}
// --------------------end
public static void setPropertyVal(Object dest, String key, Object val) {
Class<?> clazz = dest.getClass();
try {
java.lang.reflect.Method setMethod = clazz.getMethod("set"
+ StringUtils.capitalize(key), String.class);
setMethod.invoke(dest, val);
} catch (Exception e) {
log.error("Error: {}={}", key, val);
}
}
soap報文中的對應類結尾標籤可能需要增加reader.hashNext:
while (!reader.isStartElement() && !reader.isEndElement()
&& reader.hasNext()) {
reader.next();
}