Grails 2.5.6如何解析和映射请求JSON到POGO?

时间:2018-10-25 11:53:35

标签: json parsing grails pogo

Tl; dr :我想以this code绿色来测试\u001B[?1049l
感谢Jeff Scott Brown的getting me that far


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

MyCmdTest."data bind works"

使用:

def myAction(MyCmd myData) {
    ...
}

请注意@Validateable class MyCmd { SomeType some void setSome(Object value) { this.some = customMap(value) } } 如何根据JSON值(例如字符串)创建customMap的实例。假设默认设置器不起作用;例如,一个不止一次的模式就是这样的枚举:

SomeType

在这里,enum SomeType { Foo(17, "foos"), Bar(19, "barista") int id String jsonName SomeType(id, jsonName) { this.id = id this.jsonName = jsonName } } 将采用整数或字符串,并返回匹配的大小写(或customMap,如果不合适的话)。

现在,我具有以下形式的单元测试:

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 } }

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

setSome

基本上,同一件事也可以作为集成测试。

但是,运行完整的应用程序时,映射失败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. }

我必须实现或重写哪些方法,以便Grails调用我的转换(此处为some == null),而不是在不知道要做什么的地方插入customMap

1 个答案:

答案 0 :(得分:0)

可以使用cluster_member_count注释来自定义数据绑定:

@BindUsing

另请参阅the MWE repo

来源:Hubert Klein Ikkink @ DZoneOfficial Docs(还有其他自定义方式)