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();
}