Grails DataBinding
Postado em 30/04/2009 00:00
0
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
pedro.goncalves
Pontos: 0






0
0
08/05/2009 00:00
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!

wanderson.santos
Pontos: 1



0
0
09/06/2009 00:00
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é!

pedro.goncalves
Pontos: 0



0
0
15/06/2009 00:00
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

Baphomet93'.'
Pontos: 0



 


Esqueceu sua senha?
 
Grails Brasil é mantido por itexto Desenvolvimento de Projetos Ltda.
Em caso de problemas, sinta-se livre para procurar Henrique Lobo Weissmann (Kico) por e-mail: kicolobo@itexto.net
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão (clique no logo à direita para maiores detalhes)