gpt4 book ai didi

json - Grails 2.5.6 如何解析请求 JSON 并将其映射到 POGO?

转载 作者:行者123 更新时间:2023-12-02 15:43:49 25 4
gpt4 key购买 nike

Tl;博士:我想要测试 MyCmdTest."data bind works"this code绿色。
感谢 Jeff Scott Brown getting me that far .

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

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

在这里, 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
}
}

显然, setSome在两种变体中都被调用。

我还有一个 Controller 单元测试,将请求 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 调用我的转换(此处为 customMap)而不是插入 null它不知道该怎么办?

最佳答案

可以使用 @BindUsing 自定义数据绑定(bind)。注解:

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

另见 the MWE repo .

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

关于json - Grails 2.5.6 如何解析请求 JSON 并将其映射到 POGO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com