代码之家  ›  专栏  ›  技术社区  ›  Raphael

grails2.5.6如何解析并映射请求JSON到POGO?

  •  0
  • Raphael  · 技术社区  · 8 年前

    :我想参加考试 MyCmdTest."data bind works" this code 绿色。
    getting me that far .


    我有一个POGO,其中包含一些来自JSON的自定义转换,我希望在Grails控制器中接收这些转换:

    def myAction(MyCmd myData) {
        ...
    }
    

    @Validateable
    class MyCmd {
        SomeType some
    
        void setSome(Object value) {
            this.some = customMap(value)
        }
    }
    

    注意如何 customMap SomeType 从一个JSON值(比如,一个字符串)。假设默认的setter不起作用;例如,我们有一个不止一次的模式是这样的枚举:

    enum SomeType {
        Foo(17, "foos"),
        Bar(19, "barista")
    
        int id
        String jsonName
    
        SomeType(id, jsonName) {
            this.id = id
            this.jsonName = jsonName
        }
    }
    

    自定义地图 null ,如果不适合)。

    现在,我有一个如下形式的单元测试:

    class RegistrationCmdTest extends Specification {
        String validData // hard-coded, conforms to JSON schema
    
        void test() {
            MyCmd cmd = new MyCmd(JSON.parse(validData))
            // check members: success
    
            MyCmd cmd2 = JSON.parse(validData) as MyCmd
            // check members: success
        }
    }
    

    setSome 在两种变体中都调用。

    我还有一个控制器单元测试,它将请求JSON设置为相同的字符串:

    void "register successfully"() {
        given:
        ResonseCmd = someMock()
    
        when:
        controller.request.method = 'POST'
        controller.request.contentType = "application/json"
        controller.request.json = validData
        controller.myAction()
    
        then:
        noExceptionThrown()
        // successful validations: service called, etc.
    }
    

    基本上相同的东西也作为集成测试运行。

    然而,映射 失败 运行完整应用程序时; some == null .

    我必须实现或覆盖哪些方法,以便Grails调用我的转换(这里, 自定义地图 无效的

    1 回复  |  直到 8 年前
        1
  •  0
  •   Raphael    8 年前

    可以使用 @BindUsing 注释:

    @BindUsing({ newCmd, jsonMap ->
        customMap(jsonMap['someType'])
    })
    SomeType someType
    

    另请参见 the MWE repo .

    Hubert Klein Ikkink @ DZone , Official Docs