- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在开发一个 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/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!