2017-02-02 10 views
0

Java 1,8 Groovy Версия 2.4.7groovy.lang.MissingMethodException: Нет подписи метода: java.lang.String.name() применяется для типов аргументов:() значения

Я передаю XML-к переменная называется rollbackxmlResp, я пытаюсь разобрать и получить ее значение.

Xmlcontents из rollbackXmlResp:

<?xml version=\"1.0\" encoding=\"EUC-JP\"?> 
    <Root> 
     <data> 
      <easy_id>12214356</easy_id> 
      <unique_id>53706741</unique_id> 
      <rollback_all_point>100</rollback_all_point> 
      <rollback_term_point>10</rollback_term_point> 
      <rollback_lapse_point>20</rollback_lapse_point> 
      <res_time>2014-05-01 10:29:52</res_time> 
      <result_code>0</result_code> 
     </data> 
    <confirmation_key>ea7784d7d1d80cf94a4066ac48fa3088</confirmation_key> 
</Root> 

Groovy код

public static Map<String, ?> processRollbackResponse(String rollbackXmlResp, String requestTime){ 

    Map rootMap = new LinkedHashMap(); 
    def responseXml = new XmlParser().parseText(rollbackXmlResp); 
    responseXml.children().each { --> line no 172 
     def errorCodesList = new ArrayList<String>() 
      it.depthFirst().each { --> line no 174 
       switch(it.name()){ ----> failing here . line no175 

       } 
      } 
    } 

    return rootMap 

    } 

Я получаю это исключение

groovy.lang.MissingMethodException: No signature of method: java.lang.String.name() is applicable for argument types:() values: [] 
Possible solutions: take(int), any(), any(groovy.lang.Closure), wait(), size(), dump() 
    at co.xx.app.point.util.Random.processRollbackResponse_closure2$_closure6(Random.groovy:175) 
    at groovy.lang.Closure.call(Closure.java:414) 
    at groovy.lang.Closure.call(Closure.java:430) 
    at co.xx.app.point.util.Random.processRollbackResponse_closure2(Random.groovy:174) 
     at groovy.lang.Closure.call(Closure.java:414) 
    at groovy.lang.Closure.call(Closure.java:430) 
    at co.xx.app.point.util.xx.processRollbackResponse(xx.groovy:172) 
    at co.xx.app.point.util.xxSpock.processRollbackSuccessResponse(xxSpock.groovy:246) 

Пожалуйста, помогите мне решить эту проблему.

+0

Какое значение вам нужно? – Rao

ответ

0

Учитывая следующий несколько модифицированную версию кода:

def str = """\ 
<?xml version=\"1.0\" encoding=\"EUC-JP\"?> 
<Root> 
    <data> 
     <easy_id>12214356</easy_id> 
     <unique_id>53706741</unique_id> 
     <rollback_all_point>100</rollback_all_point> 
     <rollback_term_point>10</rollback_term_point> 
     <rollback_lapse_point>20</rollback_lapse_point> 
     <res_time>2014-05-01 10:29:52</res_time> 
     <result_code>0</result_code> 
    </data> 
    <confirmation_key>ea7784d7d1d80cf94a4066ac48fa3088</confirmation_key> 
</Root> 
""" 

def processRollbackResponse(String rollbackXmlResp, String requestTime) { 
    def rootMap = [:]  
    def responseXml = new XmlParser().parseText(rollbackXmlResp) 

    responseXml.children().each { child -> 
     println "child: ${child.name()}" 
     def errorCodesList = [] 
     child.depthFirst().each { node -> 
      println " node class: ${node.getClass().name} - node: $node" 
     } 
    } 

    return rootMap 
} 

processRollbackResponse(str, "sometime") 

мы получаем следующий вывод:

child: data 
    node class: groovy.util.Node - node: data[attributes={}; value=[easy_id[attributes={}; value=[12214356]], unique_id[attributes={}; value=[53706741]], rollback_all_point[attributes={}; value=[100]], rollback_term_point[attributes={}; value=[10]], rollback_lapse_point[attributes={}; value=[20]], res_time[attributes={}; value=[2014-05-01 10:29:52]], result_code[attributes={}; value=[0]]]] 
    node class: groovy.util.Node - node: easy_id[attributes={}; value=[12214356]] 
    node class: groovy.util.Node - node: unique_id[attributes={}; value=[53706741]] 
    node class: groovy.util.Node - node: rollback_all_point[attributes={}; value=[100]] 
    node class: groovy.util.Node - node: rollback_term_point[attributes={}; value=[10]] 
    node class: groovy.util.Node - node: rollback_lapse_point[attributes={}; value=[20]] 
    node class: groovy.util.Node - node: res_time[attributes={}; value=[2014-05-01 10:29:52]] 
    node class: groovy.util.Node - node: result_code[attributes={}; value=[0]] 
child: confirmation_key 
    node class: groovy.util.Node - node: confirmation_key[attributes={}; value=[ea7784d7d1d80cf94a4066ac48fa3088]] 
    node class: java.lang.String - node: ea7784d7d1d80cf94a4066ac48fa3088 

другими словами, depthFirst будет возвращать текущий узел, а затем все потомки. Вторая итерация даст вам узел «configuration_key», а затем строку «ea7784d7d1d80cf94a4066ac48fa3088».

Таким образом, исключение возникает из-за того, что для последней итерации depthFirst каждое значение переменной «node» (или второе «it» в вашем коде) представляет собой строку «ea7784d7d1d80cf94a4066ac48fa3088», а не groovy.util. Узел.

Я должен признать, что это неинтуитивное поведение от depthFirst, чтобы сказать наименее. В первую очередь это данные, easy_id, unique_id и т. Д. И не перебирает текст узла для этих узлов. Во второй раз для configuration_key он дает вам текущий узел, а затем текст узла ... т. Е. точно противоположное тому, что он делал в первый раз.

Похоже, others have noted this inconsistency as well.

Если вы замените XmlParser на XmlSlurper в своем коде, поведение будет в большей степени соответствовать тому, что вы ожидаете с помощью NodeChild, возвращаемого для каждой итерации depthFirst, включая последнюю.