RestfulController POST(save)方法中动态字段的映射

Posted

技术标签:

【中文标题】RestfulController POST(save)方法中动态字段的映射【英文标题】:Mapping of Dynamic fields in RestfulController POST (save) method 【发布时间】:2019-09-13 23:18:36 【问题描述】:

如何启用 RestfulController 自动映射甚至手动将动态字段映射到实现 MongoEntity 的域类?我有一个域类如下:

class Company implements MongoEntity<Company> 
    String id = UUID.randomUUID().toString()
    String name
    String email
    String phone

我有一个用于 CRUD 操作的 RestfulController 设置,如下所示

class CompanyController extends RestfulController<Company> 

@Transactional
    def save(Company company) 
        if(company.hasErrors()) 
            respond company.errors
        
        else 
            company.insert(flush:true)
            respond company, status: CREATED
        
    

当我发布带有一些额外 JSON 字段的请求时,如何让它们自动映射到 gorm_dynamic_attributes ?目前,公司对象不返回有关动态属性的任何信息。我面临的另一个问题是request.JSON 也是空的,所以我也无法手动映射。任何建议将不胜感激。

【问题讨论】:

为什么需要MongoEntity?它可以完美地与@Entity 一起工作,或者简单地将类放在grails-app/domain 下。这件事String id = UUID.randomUUID().toString() 也非常可疑 使用 MongoEntity 只是为了代码清晰。但是使用@Entity 并不能解决我的问题。另外,您对 UUID 的事情有何怀疑?我希望我的 id 基于 UUID 而不是 ObjectId。 @injecteer 我也尝试使用 id generator: 'uuid2' 但它不起作用。任何帮助将不胜感激 mongo 的集群范围的唯一 ID 有什么问题?他们应该像魅力一样工作。我没有尝试id generator:'uuid',但真正有效的是id generator:'assigned',这应该适用于您的情况。此外,我会将 id 生成从你的类的 init 块移动到beforeInsert(),否则它可能会弄乱加载逻辑 @injecteer 谢谢。但是我们的项目协议需要 UUID 格式的基于字符串的 id。此外,mongo 实体也不会调用 beforeInsert()。请建议我应该采取什么方法 【参考方案1】:

我很确定,问题不在于控制器的数据绑定,而在于域类实例的持久化。

我会像这样更改域类:

import grails.gorm.annotation.Entity

@Entity
class Company 
    String id
    String name
    String email
    String phone

    def beforeValidate() 
      if( !id ) setId UUID.randomUUID().toString()
      

    static mapping = 
      id generator:'assigned'
    

使用assigned 生成器。您可以将您的 id 生成放在控制器/服务代码中,或者将其留在域类'beforeValidate 中。在后一种情况下,请特别注意何时生成 id,因为beforeValidate() 经常被调用。另请注意,在 beforeValidate() 内部必须调用 setter。

我用save()insert() 测试了我的类似域类,并且在这两种情况下都像魅力一样工作。

【讨论】:

以上是关于RestfulController POST(save)方法中动态字段的映射的主要内容,如果未能解决你的问题,请参考以下文章

快速检查 HTTP Post 请求

Post-Termination Exercise Period是啥意思?

Django DB Models F 组合表达式

获取与 Restful 控制器链接传递的参数

Bash编程 命令行解析与扩展

PHP过滤器,如何过滤输入数组