Problema c/ ClassCastException nos parâmetros do controlador
16/12/2009 00:00
0
Estou utilizando o Grails 1.1.2 e tenho um problema na hora de passagem de parâmetros em todos os controladores (não alterei eles), na linha que tem objetoInstance.properties = params na closure update, na seguinte situação:

- quando este objetoInstance tem uma relação com outro objeto e esta relação não for nula.
- apenas quando edita e salva o objetoInstance pela segunda vez (desde que anteriormente o relacionamento com o outro objeto seja nulo, se não for nulo, o erro acontece em todas as vezes que for atualizar)
- quando utilizo a engine InnoDB do MySQL, que possui suporte a constraints, se uso MyISAM não ocorre o problema (EDIT: ocorre o erro mesmo com MyISAM)

O problema eh este:

Error 500: java.lang.ClassCastException: SituacaoContabil$__clinit__closure1 cannot be cast to java.util.Map
Servlet: grails
URI: /svma/grails/situacaoContabilProcesso/update.dispatch
Exception Message: SituacaoContabil$__clinit__closure1 cannot be cast to java.util.Map
Caused by: java.lang.ClassCastException: SituacaoContabil$__clinit__closure1 cannot be cast to java.util.Map
Class: SituacaoContabilProcessoController
At Line: [74]
Code Snippet:
70: situacaoContabilProcessoInstance.properties = params
71: if (!situacaoContabilProcessoInstance.hasErrors() && situacaoContabilProcessoInstance.save()) {

Neste caso, o objeto situacaoContabilProcessoInstance tem uma relação com situacaoContabil:

Classe SituacaoContabilProcesso:
static belongsTo = [processo:Processo, situacaoContabil:SituacaoContabil]

Classe SituacaoContabil:
static hasMany = [situacoesContabeisProcesso:SituacaoContabilProcesso]



eu fiz um println params antes de dar o erro, e eh exibido isto:

[data_day:16, processo:[id:1], situacaoContabil.id:null, data_year:2009, _action_update:Update, data:struct, data_month:12, data_hour:08, processo.id:1, data_minute:50, version:0, id:1, situacaoContabil:[id:null], action:index, controller:situacaoContabilProcesso]

o problema esta nos parâmetros processo e situacaoContabil quando não são nulos, parece que ele não consegue fazer a ligação de situacaoContabilProcessoInstance.processo = params.processo (o caso de situacaoContabil tbm) pq o parâmetro processo é um mapa, daí eu pego o id do mapa, busco o objeto, e atribuo a situacaoContabilProcessoInstance.processo que resolve, mas o estranho é que na hora de salvar o objeto pela primeira vez não dá problema (que tbm é passado um mapa), só na hora de atualizar. Pq isto?
Tags: Grails


0
Oi fpdella,

como você está passando os valores para o seu controlador? Pela própria view ou de algum outro modo?


0
Pela própria view, mesmo não alterando as páginas e os controladores, todas elas geradas pelo generate-all. Antes eu achava que era só em uma entidade, mas vi que é na aplicação toda.

E acho que me equivoquei em relação a engine do MySQL, testei agora de novo e através do MyISAM ocorre o mesmo problema que no InnoDB.
16/12/2009 00:00


0
Uai fpdella, realmente estranho este seu problema.

Bom: vamos por partes então que, se bobear, a gente consegue resolvê-lo nesta thread ok?

* Com relação ao motor de armazenamento selecionado para o MySQL.
Como você mesmo mencionou, é pouco provável que seu problema seja causado pelo motor de armazenamento, uma vez que, caso algo desse errado, a excessão disparada seria uma SQLException ou ConstraintException.
E, também, você testou com o MyISAM e teve o mesmo problema.

Ok, descartamos a primeira possibilidade.

Agora, vamos ver o resto:

At Line: [74]
Code Snippet:
70: situacaoContabilProcessoInstance.properties = params
71: if (!situacaoContabilProcessoInstance.hasErrors() && situacaoContabilProcessoInstance.save()) {

rola de copiar a sua action pra cá e assim a gente dar uma analisada nela?


0
Inclusive testei com o HSQLDB em memória e também deu o mesmo problema. O código é padrão em todos os controladores, aqui vai:


def update = {
def situacaoContabilProcessoInstance = SituacaoContabilProcesso.get(params.id)
if (situacaoContabilProcessoInstance) {
if (params.version) {
def version = params.version.toLong()
if (situacaoContabilProcessoInstance.version > version) {

situacaoContabilProcessoInstance.errors.rejectValue("version", "situacaoContabilProcesso.optimistic.locking.failure", "Another user has updated this SituacaoContabilProcesso while you were editing")
render(view: "edit", model: [situacaoContabilProcessoInstance: situacaoContabilProcessoInstance])
return
}
}
situacaoContabilProcessoInstance.properties = params
if (!situacaoContabilProcessoInstance.hasErrors() && situacaoContabilProcessoInstance.save()) {
flash.message = "situacaoContabilProcesso.updated"
flash.args = [params.id]
flash.defaultMessage = "SituacaoContabilProcesso ${params.id} updated"
redirect(action: "show", id: situacaoContabilProcessoInstance.id)
}
else {
render(view: "edit", model: [situacaoContabilProcessoInstance: situacaoContabilProcessoInstance])
}
}
else {
flash.message = "situacaoContabilProcesso.not.found"
flash.args = [params.id]
flash.defaultMessage = "SituacaoContabilProcesso not found with id ${params.id}"
redirect(action: "edit", id: params.id)
}
}
16/12/2009 00:00


0
Estive olhando aqui no forum o tópico que fala sobre a versão 1.1.2 e achei isto:

<!-- m --><a class="postlink" href="http://jira.codehaus.org/browse/GRAILS-5445">http://jira.codehaus.org/browse/GRAILS-5445</a><!-- m -->

Acho que o problema esta nesta versão, acabei de testar com a 1.1.1 e não deu o problema até agora. Vou voltar pra 1.1.1.
16/12/2009 00:00


0
putz fpdella, ai é foda!

eu reamlente havia lido o seu post e não estava encontrando nada de errado.
torcer agora para que resolvam rápido isto.

sabe: às vezes fico um pouco preocupado com a quantidade de bugs que vejo os outros usuários do Grails Brasil topando aqui no fórum.

realmente acho que não deveria haver uma versão 1.1.2 do Grails, mas sim uma 1.1.15 ou posterior <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->


0
Temos que pisar em ovos nestas trocas de versões do Grails... inclusive já tive problemas com plugins (o acegi), que tive que retroceder algumas versões para fazer funcionar.

E obrigado kikolobo pelo apoio =)
16/12/2009 00:00


0
[quote=&quot;fpdella&quot;]Temos que pisar em ovos nestas trocas de versões do Grails... inclusive já tive problemas com plugins (o acegi), que tive que retroceder algumas versões para fazer funcionar.

E obrigado kikolobo pelo apoio =)[/quote]

Uai, precisando to ai!
Só fico meio chateado de desta vez não ter conseguido resolver seu problema


0
Esse é o bug que me fez fazer downgrade pra versão 1.1.1 e esperar a 1.2....

<!-- m --><a class="postlink" href="http://jira.codehaus.org/browse/GRAILS-5445">http://jira.codehaus.org/browse/GRAILS-5445</a><!-- m -->

No link acima tem um workaround que não funcionou totalmente pra mim...

[]'s

Rodrigo Auler
16/12/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