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)方法中动态字段的映射的主要内容,如果未能解决你的问题,请参考以下文章