gpt4 book ai didi

grails - RestfulController 没有在 POST 中绑定(bind)嵌套的 JSON

转载 作者:行者123 更新时间:2023-12-02 16:02:51 37 4
gpt4 key购买 nike

我正在 Grails 2.4.4 中构建一个 REST API,并依靠 RestfulController 来处理基本的 CRUD 类型功能。前端是在 AngularJS 1.3 中构建的,并且在大多数情况下,Angular 的 $resource 和 Grails RestfulController 工作得很好,不需要我编写很多样板代码。我有一个主要问题,即当我将 JSON 从 Angular 发布到 Grails 时,具有 hasMany 关系的域对象没有按预期绑定(bind)。

例如,采用以下域对象:

class Task {

String name
//auto timestamps
Date dateCreated
Date lastUpdated

static hasMany = [filters:TaskFilter]

static constraints = {
}

}

class TaskFilter {

String filterMetaData

static belongsTo = [task:Task]

static constraints = {
task column: 'task_id'
}
}

例如,当我发布这样的对象时:
{name: "Task 1", filters: [{filterMetaData:'some-meta-data'}]}

我在 Grails 中收到以下错误:
| Error 2015-02-10 17:41:34,619 [http-bio-8080-exec-5] ERROR errors.GrailsExceptionResolver  - NullPointerException occurred when processing request: [POST] /api/studies/1/tasks
Stacktrace follows:
Message: null
Line | Method
->> 99 | $tt__save in grails.rest.RestfulController
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter . . . . . in grails.plugin.cache.web.filter.AbstractFilter
| 104 | processFilterChain in com.odobo.grails.plugin.springsecurity.rest.RestTokenValidationFilter
| 71 | doFilter . . . . . in ''
| 53 | doFilter in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
| 122 | doFilter . . . . . in com.odobo.grails.plugin.springsecurity.rest.RestAuthenticationFilter
| 82 | doFilter in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 63 | doFilter . . . . . in com.odobo.grails.plugin.springsecurity.rest.RestLogoutFilter
| 82 | doFilter in com.brandseye.cors.CorsFilter
| 1145 | runWorker . . . . in java.util.concurrent.ThreadPoolExecutor
| 615 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run . . . . . . . in java.lang.Thread

我不确定这个错误是怎么回事,因为它非常模糊,但是 Task 和 TaskFilter 被回滚并且没有保存任何内容。

奇怪的是,如果我从 TaskFilter 中去掉这行代码:
static belongsTo = [task:Task]

一切正常,除了这迫使我有一个 task_task_filter 连接表,而不是更容易在 task_filter 表中 grok task_id 列。

在过去的几天里,我一直在这里以及各种论坛、博客和邮件列表上阅读帖子,但没有找到解决方案。大多数帖子都较旧,所以我不知道它们是否适用,但有几个只是简单地说“你不能使用 Grails 绑定(bind) JSONArray”,这看起来很奇怪,因为它是任何中等复杂数据模型的常见要求。

无论如何 - 如果有人能指出一些具体和最新的东西,或者说“你做不到”或者如何实际处理这种情况,我将不胜感激。如果可能的话,我宁愿避免编写自定义解析代码来管理它,因为 RestfulController 的其余部分就像一个魅力。另外,如果有任何解释说明为什么当我删除了关系的 belongsTo 端时这会起作用,这可能会帮助我理解这里发生了什么。

以防万一有人想知道我的 RestfulController 子类如下所示:
class TaskController extends RestfulController<Task> {

static responseFormats = ['json', 'xml']

TaskController() {
super(Task)
}
}

最佳答案

在与 grails 开发团队多次讨论后,我被告知我对它应该如何工作的理解不是 Grails 的工作方式。我假设(错误地)因为数据绑定(bind)将 TaskFilter 添加到 Task 中,所以它的行为就像在 Task 上调用 addToFilters() 一样,但无论这不是创建集合的方式。我不知道收藏实际上是什么,但它绝对不会保存它们..

JIRA 已按“预期行为”关闭。

之后我的解决方法是在我的 TaskController 中

@Override
protected Task createResource() {
Task task = super.createResource()
if (task.filters) {
task.filters.each {filter ->
task.addToFilters(filter)
}
}
task
}

不幸的是,基于 RestfulController 的应用程序中的任何关联都需要这种相同类型的代码来处理嵌套资源。我仍然认为 Grails 应该在框架中处理这个问题,如果我能抽出时间来处理它,我可能会尝试将该功能添加到代码中。

关于grails - RestfulController 没有在 POST 中绑定(bind)嵌套的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443627/

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