gpt4 book ai didi

json - 将 JSON 绑定(bind)到嵌套的 Grails 域对象

转载 作者:IT老高 更新时间:2023-10-28 12:47:19 25 4
gpt4 key购买 nike

我正在开发一个 RESTful 接口(interface),用于为 JavaScript 应用程序提供 JSON 数据。

在服务器端,我使用 Grails 1.3.7 并使用 GORM 域对象进行持久化。我实现了一个自定义 JSON Marshaller 来支持编码嵌套的域对象

以下是示例域对象:

class SampleDomain {
static mapping = { nest2 cascade: 'all' }
String someString
SampleDomainNested nest2
}

class SampleDomainNested {
String someField
}

SampleDomain 资源发布在 URL/rs/sample/下,因此/rs/sample/1 指向 ID 为 1 的 SampleDomain 对象

当我使用自定义 json 编码器(GET on/rs/sample/1)呈现资源时,我得到以下数据:

{
"someString" : "somevalue1",
"nest2" : {
"someField" : "someothervalue"
}
}

这正是我想要的。

现在问题来了:我尝试通过 PUT 将相同的数据发送到资源/rs/sample/1。

为了将 json 数据绑定(bind)到域对象,处理请求的 Controller 调用 def domain = SampleDomain.get(id)domain.properties = data where data是未编码的对象。

“someString”字段的绑定(bind)工作正常,但嵌套对象未使用嵌套数据填充,因此我收到一个错误,即属性“nest2”为空,这是不允许的。

我已经尝试实现自定义 PropertyEditorSupport 以及 StructuredPropertyEditor 并为该类注册编辑器。

奇怪的是,只有在我提供非嵌套值时才会调用编辑器。因此,当我通过 PUT 将以下内容发送到服务器时(这没有任何意义;))

{
"someString" : "somevalue1",
"nest2" : "test"
}

至少调用了属性编辑器。

我查看了 GrailsDataBinder 的代码。我发现通过指定关联的路径而不是提供 map 来设置关联的属性似乎可以工作,因此以下内容也可以:

{
"someString" : "somevalue1",
"nest2.somefield" : "someothervalue"
}

但这对我没有帮助,因为我不想实现自定义 JavaScript 到 JSON 对象序列化器。

是否可以通过嵌套映射来使用 Grails 数据绑定(bind)?还是我真的要为每个域类手动实现它?

非常感谢,

马丁

最佳答案

由于这个问题被多次投票,我想分享一下我最后做了什么:

因为我有更多的要求要实现,比如安全等。我实现了一个服务层,它对 Controller 隐藏域对象。我介绍了一个“动态 DTO 层”,它将域对象转换为 Groovy 映射,可以使用标准序列化程序轻松序列化,并手动实现更新。我尝试实现的所有基于半自动/元编程/命令模式/...的解决方案在某些时候都失败了,主要是导致奇怪的 GORM 错误或大量配置代码(以及很多挫败感)。 DTO 的更新和序列化方法相当简单,可以非常快速地实现。它也不会引入大量重复代码,因为如果您不想发布内部域对象结构,则无论如何都必须指定域对象的序列化方式。也许这不是最优雅的解决方案,但它是唯一真正对我有用的解决方案。它还允许我实现批量更新,因为更新逻辑不再连接到 http 请求。

但是我必须说,我不认为 grails 是最适合此类应用程序的适当技术堆栈,因为它使您的应用程序非常笨重且不灵活。我的经验是,一旦你开始做框架默认不支持的事情,它就会开始变得困惑。此外,我不喜欢 grails 中的“存储库”层本质上仅作为域对象的一部分存在,这会带来很多问题并导致多个“代理服务”模拟存储库层。如果您开始使用 json REST 接口(interface)构建应用程序,我建议您选择像 node.js 这样非常轻量级的技术,或者,如果您想/必须坚持使用基于 java 的堆栈,请使用标准 spring 框架 + spring mvc + spring data 带有一个漂亮而干净的 dto 层(这是我迁移到的,它就像一个魅力)。您不必编写大量样板代码,您可以完全控制实际发生的事情。此外,您可以获得强大的类型,从而提高开发人员的生产力和可维护性,并使额外的 LOC 合法化。当然,强大的类型意味着强大的工具!

我开始写一篇博客文章来描述我提出的架构(当然还有一个示例项目),但是我现在没有太多时间来完成它。完成后,我将在此处链接到它以供引用。

希望这可以为遇到类似问题的人提供启发。

干杯!

关于json - 将 JSON 绑定(bind)到嵌套的 Grails 域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7527331/

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