2011-09-08 10 views
6

Estoy tratando de usar el bloque con en Groovy para inicializar fácilmente mi clase, pero me aparece el siguiente error. ¿Alguien podría decirme qué estoy haciendo mal?groovy "con" consulta de uso de bloque

MyXMLTemplate template = new MyXMLTemplate().with { 
    TxId = 'mnop' 
    oapTxId = 'abcd' 
} 

El error que consigo es:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'abcd' with class 'java.lang.String' to class 'org.example.MyXMLTemplate' 
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:331) 
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:599) 

estoy usando maravilloso 1.8.0

Respuesta

14

necesita devolver la propia plantilla de la with bloque:

MyXMLTemplate template = new MyXMLTemplate().with { 
    TxId = 'mnop' 
    oapTxId = 'abcd' 
    it 
} 
+1

sí esto funciona! La documentación no tiene esto, sin embargo ... :( – Abe

+1

¿Qué página de la documentación? El sitio principal de Groovy es un wiki, así que se puede cambiar para que sea correcto :-) –

+0

Debería haber dicho "Javadoc". He descargado la fuente y obtengo esta documentación incompleta en el cursor del mouse .-> Esto se usa comúnmente para simplificar la creación de objetos, como en este ejemplo: def p = new Person(). Con {firstName = 'John' lastName = 'Doe '} – Abe

3

Es difícil ver cuál es el problema sin ver la definición de la clase. Asumiré que TxId y oapTxId son ambas propiedades de la clase.

Sospecho que su error se debe a que oapTxId es del tipo MyXMLTemplate, por lo que no se puede asignar desde String.

Incidetally, como su bloque with es sólo inicializando propiedades de la clase, se puede utilizar el constructor y los emisores más idiomática enfoque:

MyXmlTemplate template = new MyXMLTemplate(TxId: 'mnop', oapTxId : 'abcd') 
Cuestiones relacionadas