解決axis2 wsdl與請求soap報文中字段順序不一致的問題:Unexpected subelement XXXX

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章