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

时间:2019-04-24 15:34:45

标签: spring-boot grails groovy gorm gorm-mongodb

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

df <- structure(list(Datetime = structure(c(1451650740, 1451650800, 
1451650860, 1451654400, 1451654460, 1454277480, 1454277540, 1454277600, 
1454277660), class = c("POSIXct", "POSIXt"), tzone = ""), Energy = c(743.0253, 
765.7225, 788.1493, 834.7815, 857.3012, 3427.098, 3397.591, 3344.149, 
3270.803), Station = c("Ajmer", "Ajmer", "Ajmer", "Ajmer", "Ajmer", 
"Kotada", "Kotada", "Kotada", "Kotada")), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"), class = "data.frame")

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

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

当我发布带有其他JSON字段的请求时,如何将它们自动映射到gorm_dynamic_attributes?当前,公司对象不返回有关动态属性的任何信息。我面临的另一个问题是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 } } } 也为null,所以我也不能手动映射。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

我将像这样更改域类:

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()测试了类似的领域类,在两种情况下都像魅力一样工作。