Grails DataBinding
30/04/2009 00:00
0
Pessoal, ultimamente estive com problemas com o Grails em relação a binding de listas, quando esta lista é um objeto complexo.

Imaginem propriedades no seu form do tipo:

listaLinks[0].id=lala
listaLinks[0].nome=lala

listaLinks[5].id=lala
listaLinks[5].nome=lala


O problema:
Quando o grails faz o binding de collections(Lists), o tipo padrão a ser instanciado é ArrayList, porém neste tipo em particular você não pode por por ex: add(posicao100), pois ele cria um bag de 10 em 10 (Padrão). Devido a isso, quando você tem posições que pulam posições vocês irão encontrar excessões no grails como: IndexOfBounds exception, que na verdade é gerado pelo Spring.

Depois de debugar um bocado e pesquisar, vou deixar aqui a dica:

Anteriormente temos uma classe Por ex, um command assim:

class LinksCommand {
List<SUACLASSEENTITY> listaLink
&#125;


Para que o grails se comporte da maneira desejada, basta por:

class LinksCommand &#123;
List<SUACLASSEENTITY> listaLink = org.apache.commons.collections.list.LazyList.decorate(
new ArrayList(),
org.apache.commons.collections.FactoryUtils.instantiateFactory(SUACLASSEENTITY.class)
);
&#125;



Resumo da ópera: É uma maneira elegante de não fazer gambiarras do tipo: lista1.nome e etc..

ps: Não esqueçam de incluir a biblioteca commons-collections no seu classpath

Até!
Tags: Tópicos avançados


0
Oi Pedro!

Interessante é que na documentação Grails 1.1, é citado que a plataforma faria isto automaticamente, em &quot;6.1.6 Data Binding&quot; no item &quot;Data Binding and Many-ended Associations&quot;:

Note also that if the association you are binding to has a size of 2 and you refer to an element that is outside the size of association:

<g:textField name=&quot;books[0].title&quot; value=&quot;the Stand&quot; />
<g:textField name=&quot;books[1].title&quot; value=&quot;the Shining&quot; />
<g:textField name=&quot;books[2].title&quot; value=&quot;Red Madder&quot; />

Then Grails will automatically create a new instance for you at the defined position. If you &quot;skipped&quot; a few elements in the middle:

<g:textField name=&quot;books[0].title&quot; value=&quot;the Stand&quot; />
<g:textField name=&quot;books[1].title&quot; value=&quot;the Shining&quot; />
<g:textField name=&quot;books[5].title&quot; value=&quot;Red Madder&quot; />


Contudo tenho tido o problema inconsistente (e mesmo com a sua solução, não se resolveu), no momento de um fornecimento.properties = param.

Error 500&#58; org.springframework.beans.NullValueInNestedPathException&#58; Invalid property 'itensFornecimento[0].produto' of bean class [Fornecimento]&#58; Value of nested property 'itensFornecimento[0].produto' is null


Acontece quando eu tento inserir um novo item, numa tela de edição. Os campos do novo item são postados através de uma linha de tabela adicionada dinamicamente numa tabela da página via jQuery, e os campos seguem a instrução de data binding do Grails/SpringMVC.

Se alguém tiver uma sugestão, é bem vinda!


0
Noto ainda imaturidade em relação a data binding no Grails.

Porém isto que você fez não irá funcionar.

Você terá que utilizar o método bindData (bindData(command,params)).

Quando você chama diretamente a propriedade parameters, ele pula o data binding.

ps: a dica postada acima é válida apenas para command object, quando é domain, o databinding do grails faz isto automaticamente, porém apenas no construtor da classe.

té!
09/06/2009 00:00


0
93!

Noto ainda imaturidade em relação a data binding no Grails.


Pq? E qual é essa imaturidade na sua opnião?

[]'s

93,93/93
15/06/2009 00:00



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto