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

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top