Este é um uso válido dos transientes do Grails?
-
23-09-2019 - |
Pergunta
Eu tenho um objeto de domínio no qual desejo armazenar algumas coisas que só existem em tempo de execução.Eu olhei para o documentação e encontrei o transients
palavra-chave, que, aparentemente, era o que eu estava procurando.Aqui está a aparência do meu objeto de domínio ...
class Contact {
def Seeker
def beforeInsert()
{
initiatedDate = new Date()
}
Date initiatedDate
Date acceptedDate
static transients = ['pal']
Seeker pal
}
onde Seeker
é uma classe interessante que não é um objeto de domínio, mas um espaço reservado para algumas propriedades.
Até agora está tudo bem e minha tabela de Contatos não possui um pal
campo conforme esperado.No meu ContactController
Eu procuro um monte de contatos, c
, então procure seus Seeker
amigos (detalhes de como retido) e definir o pal
campo para um novo objeto.
c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON
Tudo isso parece funcionar bem, exceto que o objeto pal está faltando no JSON retornado.
Este é um uso válido de transientes?Os documentos mencionam que eles são úteis para getters e setters baseados em funções, mas no meu caso eu quero um objeto real.Devo escrever um método getPal() e setPal() no meu objeto?
Obrigado
Solução
Os transientes são de fato usados para impedir que campos em objetos de domínio sejam persistidos.(Se você quiser executar algum init no campo pal sem precisar colocá-lo em seu controlador, você pode usar o evento onLoad() ou escrever um método getPal() que substituiria o getter de propriedade padrão).Você também está certo ao observar que o empacotador JSON padrão renderiza apenas campos persistentes.
Ao renderizar meus objetos de domínio, achei útil criar empacotadores de objetos JSON para que propriedades indesejadas não fossem renderizadas, mas isso também resolveria seu problema transitório.Você pode fazer isso usando o método JSON.registerObjectMarshaller:
import grails.converters.JSON
...
class BootStrap {
def init = {servletContext ->
JSON.registerObjectMarshaller(Contact ) {
def returnArray = [:]
returnArray['id'] = it.id
returnArray['initiatedDate'] = it.initiatedDate
returnArray['acceptedDate'] = it.acceptedDate
returnArray['pal'] = it.pal
return returnArray
}
JSON.registerObjectMarshaller(Seeker) {
...
}
Se você adicionar os marshallers em seu BootStrap.groovy, eles estarão disponíveis em seus controladores.
HTH
(Também encontrei isto: http://old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970)