2013-09-04 11 views
6

Sto cercando di capire come deserializzare e convalidare oggetti nidificati nella richiesta JSON in un oggetto comando Grails 2.1.1.Come si associa correttamente un elenco di oggetti in un comando Grails?

Attualmente ho un oggetto comando nel mio controller che ha alcune proprietà di base e poi la lista degli oggetti di dominio,

protected static class CustomCommand { 
    String name 
    String description 
    List<DomainObject> objs 
} 

e un corpo JSON alla mia richiesta POST,

{ 
    name: 'test name', 
    description: 'test description', 
    objs: [ 
     { 
      name: 'test sub object', 
      description: 'test description' 
     } 
    ] 
} 

I vedo l'oggetto comando creato con una matrice vuota. Qualche idea su come posso ottenere gli oggetti secondari nel mio corpo JSON per deserializzare nell'oggetto comando e quindi convalidarli?

In precedenza ho lavorato a questo problema creando manualmente un oggetto dalla mappa dei parametri e convalidandolo direttamente, ma mi sembra una soluzione alternativa che non sfrutta tutto ciò che offre Grails.

+1

Ti sei imbattuto in [questa discussione] (http://grails.1312388.n4.nabble.com/JSON-Unable-to-Marshall-to-a-Domain-Object-no-matching-editors- o-conversion-strategy-found-td4632722.html) ultimamente? – dmahapatro

+0

@dmahapatro, grazie che è utile, il TLDR è che sembra non funzionare fuori dalla scatola. Vuoi prendere il tempo per riassumere quel thread in una risposta in modo che io possa darti un upvote? –

risposta

1

non ho mai avuto questo per lavorare sotto Grails 2.1.1, ma a quanto pare questo è stato fissato in Grails 2.3,

Binding Request corpo a comandare Oggetti Se la richiesta è di m Adotta un'azione del controllore che accetta un oggetto comando e la richiesta include un corpo, il corpo verrà analizzato e utilizzato per eseguire il binding dei dati all'oggetto comando. Ciò semplifica i casi di utilizzo in cui una richiesta include un corpo JSON o XML (ad esempio) che può essere associato a un oggetto comando. Vedi la documentazione degli oggetti Command per maggiori dettagli.

7

Abbiamo avuto un problema simile con i dati del bind post in una lista all'interno di un comando. La nostra soluzione che ha funzionato è stato quello di definire un valore predefinito per gli elementi di raccolta:

class MyCommand {  
    List<MyClass> items= [].withLazyDefault { 
     new MyClass() 
    } 
} 

Dopo che i dati post è stato associato correttamente alla lista. Penso che la ragione è che Groovy ignora il parametro di tipo generico della lista e non sa quale oggetto istanziare in fase di runtime.

I'am non so se questo funziona nel vostro caso, ma forse vale la pena di provare

Aggiornamento:

ho usato questo pochi minuti fa:

public static class MyCommand { 
    String foo 
    List<Bar> bars 

    public String toString() { 
     return "foo: " + foo + ", bars: " + bars 
    } 
} 

public static class Bar { 
    String baz 
} 

regolatore metodo:

def test() { 
    println new MyCommand(request.JSON) 
} 

Ho postato alcuni js sull'utilizzo di jQuery:

$.ajax({ 
    type: "POST", 
    url: '...', 
    data: JSON.stringify({ 
     'foo': '12345', 
     bars: [ 
      {baz: '1'}, 
      {baz: '2'} 
     ] 
    }), 
    contentType : 'application/json', 
}); 

L'output di stampa dal controllore:

foo: 12345, bars: [[baz:1], [baz:2]] 

Così sembra funzionare: o

+1

Sì Groovy ignora il tipo del generico perché è tutto in fase di esecuzione e questo è un controllo del tempo di compilazione, l'ho incluso nella domanda solo per chiarezza. Sfortunatamente il tuo lavoro non funziona per me. Quale versione di Grails stai usando? –

+0

Grails 2.1.3:/ – micha

+0

Ho provato con Grails 2.1.3, ancora senza fortuna. –

Problemi correlati