Grails - 如何取消注册已注册的对象marshaller

tec*_*bar 5 grails groovy json marshalling unmarshalling

我的Persongrails应用程序中有一个域类,我需要根据上下文以不同的形式(JSON)输出.

在一个上下文中,我只需要渲染几个字段(比如id和name).在另一个上下文中,我想渲染更多(id,name,credentials,age等).我想知道是否有可能在使用后立即取消注册特定的编组.

基本上我正在寻找的是:

-------------------------------------------------------------

// context #1
JSON.registerObjectMarshaller(Person) {
    ... output just id and name
}

render myPerson as JSON

JSON.unregisterObjectMarshaller(Person) // how do i do this?

-------------------------------------------------------------

// context #2
JSON.registerObjectMarshaller(Person) {
    ... output all fields
}

render myPerson as JSON

JSON.unregisterObjectMarshaller(Person) // how do i do this?

-------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

注意:我可以为Person创建2个空子类,然后为每个子类注册单独的Marshallers.随着上下文数量的增加,虚拟子类的数量也会增加.这是非常不洁净的imo.

Joe*_*art 17

你可能想要使用所谓的命名配置而不是'交换'marshallers.你可以将它包装成一个更整洁的类/实用程序,但在某个地方(如Bootstrap.groovy),执行:

JSON.createNamedConfig('thin') {
    it.registerObjectMarshaller( Person ) { Person person ->
        return [
            id: person.id,
            name: person.name,
        ]
    }
}

JSON.createNamedConfig('full') {
    it.registerObjectMarshaller( Person ) { Person person ->
        return [
                id: person.id,
                name: person.name,
                age: person.age
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在控制器中,您可以选择要显示的编组人员的样式:

// Show lots of stuff
JSON.use('full') {
    render people as JSON
}
Run Code Online (Sandbox Code Playgroud)

要么

// Show less stuff
JSON.use('thin') {
    render people as JSON
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿,谢谢......我写了一篇博客文章:) (2认同)