NullPointerException em método save()
01/10/2015 02:00
0
Não estou entendendo um erro que está ocorrendo. A descrição da Exception também não ajuda.

Sempre que tento salvar o objeto Requisicao que possui uma lista de Servico, ocorre o nullpointer. E só ocorre se a classe Requisicao possuir algum Servico, caso contrário funciona.

Segue o código:

?class Requisicao {
Date dataSolicitacao
String proprietario
String relacaoProprietario
String relacaoOutraProprietario
Requerente requerente
static hasMany = [servicos:Servico]
    static constraints = {
dataSolicitacao nullable: true
requerente nullable: false
servicos nullable: true
    }
static mapping = {
version false
}
}
class Servico {
Date dataExecucao
TipoServico tipoServico
AlturaArvore alturaArvore
Requisicao requisicao
    static constraints = {
dataExecucao nullable: true
tipoServico nullable: false, blank: false
alturaArvore nullable: false, blank: false, default: 'M'
requisicao nullable: false
    }
static mapping = {
version false
}
}
// SERVICE:
def incluir(Requisicao requisicao) {
requisicao.requerente.endereco.save()
requisicao.requerente.save()
requisicao.save() // Linha que ocorre o erro
}

StackTrace:
java.lang.reflect.InvocationTargetException: null
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: null
at sisarb.RequisicaoService.$tt__incluir(RequisicaoService.groovy:33)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:93)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:90)
at sisarb.RequisicaoController.$tt__save(RequisicaoController.groovy:41)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:93)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:90)
at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:93)
at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:90)
... 3 common frames omitted

Outras entidades que não me parecem ter relação com o erro:

?class TipoServico {

String nome

static constraints = {
nome nullable: false, blank: false, maxSize: 10, unique: true
}

static mapping = {
version false
}

String toString() {
nome
}
}

class AlturaArvore {

String id
String nome

static constraints = {
id nullable: false, blank: false, unique: true, maxSize: 1
nome nullable: false, blank: false, maxSize: 10, unique: true
}

static mapping = {
id generator:'assigned', column:'id'
version false
}

String toString() {
nome
}
}

Se alguém tiver uma dica eu agradeço.
Tags: NullPointerException save hasMany domain


3
Experimente ao invés de declarar um membro "Requisicao requisicao" no serviço, utilizar o belongsTo
class Servico {
?static belongsTo = [requisicao: Requisicao]
}

E ao adicionar um serviço à requisicao, utilizar o addTo:
requisicao.addToServicos(servico)


0
Excelente explicação Magno!

Victor, como você está salvando o filho e o pai ao mesmo tempo, chamado o método addTo, quando for salvar o pai, automaticamente irá salvar os filhos junto.


0
Resolvido. Obrigado!

Não precisei usar o addTo pois o relacionamento bidirecional já estava vindo preenchido corretamente da tela.

O belongsTo resolveu. Imaginava que "Requisicao requisicao" era sinonimo de "belongsTo  = [requisicao: Requisicao]".

Mas deduzo que sempre que existir um "hasMany" do outro lado do relacionamento, terei que usar o "belongsTo" para não tomar esse erro nada descritivo.


1
Pode usar sem o belongsTo, só tenha ciência de que isso afeta o cascade.
https://grails.github.io/grails-doc/latest/ref/Domain%20Classes/belongsTo.html


3
Victor, segue uma forma de capturar o erro exato ocorrido com o save (ou outro método como o merge):

if (!teste.save()) {
  print teste.errors.allErrors.join(' \n')
}
15/10/2015 15:38



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