2013-09-05 3 views
1
import groovy.xml.MarkupBuilder 
class Foo { 
    Foo() {} 
    String boo() { 
     def writer = new StringWriter() 
     def xml = new MarkupBuilder(writer) 
     xml.records() { 
      car(name:'HSV Maloo', make:'Holden', year:2006) { 
       country('Australia') 
       record(type:'speed', 'Production Pickup Truck with speed of 271kph') 
      } 
     } 
     println writer 
    } 
    def methodMissing(String methodName, args) { 
     println "Get called" 
    } 
} 

Foo a = new Foo() 
a.boo() 

Результат:Groovy перестает работать, когда methodMissing() реализуется

Get called 
<records /> 

Без реализации methodMissing(), результат:

<records> 
    <car name='HSV Maloo' make='Holden' year='2006'> 
    <country>Australia</country> 
    <record type='speed'>Production Pickup Truck with speed of 271kph</record> 
    </car> 
</records> 

Я почесал голову кровотечение прямо сейчас, что же я скучаю Вот?

+0

похоже, внутри затворов, используемых MarkupBuilder, «это» по-прежнему указывает на содержащего класс, так что если methodMissing присутствует, он «скрывает» динамический методы, используемые строителем, поскольку все неизвестные вызовы перенаправляются на «методMi ssing '. Кроме этого, я не могу сказать ... – Grim

ответ

1

Проблема заключается в том, что, когда boo() называется, он создает MarkupBuilder и в конечном итоге попадает:

 car(name:'HSV Maloo', make:'Holden', year:2006) { 

Проверяется для метода car в своем классе, и если один не найден, он проверяет один в делегате closure (MarkupBuilder). MarkupBuilder ловит это и создает узел xml.

Однако, вы определили methodMissing, поэтому, когда он проверяет свой класс для метода car, он находит и использует вместо (ничего не делает)

Чтобы исправить это, вы можете специально попросить для MarkupBuilder быть используемый по телефону xml.car(), xml.country() и т.д:

String boo() { 
    def writer = new StringWriter() 
    def xml = new MarkupBuilder(writer) 
    xml.records() { 
     xml.car(name:'HSV Maloo', make:'Holden', year:2006) { 
      xml.country('Australia') 
      xml.record(type:'speed', 'Production Pickup Truck with speed of 271kph') 
     } 
    } 
    println writer 
} 
Смежные вопросы