Mongodb JSON对象、动态属性和序列化(使用Grails&;蒙哥达

Mongodb JSON对象、动态属性和序列化(使用Grails&;蒙哥达,mongodb,grails,jackson,dynamic-properties,Mongodb,Grails,Jackson,Dynamic Properties,我正在尝试使用Grail的MongoDB插件将通用JSONObject保存到域对象。基本上,它不适用于常规属性(这并不奇怪)。因此,我添加了一个动态属性,它将JSONObject保存到DB并将其拉出(耶)。但是,由于我用Jackson serializer替换了默认的JSON序列化程序(由于MongoDB插件和域对象的不良行为),所以动态属性没有被序列化 我可以使用什么API将所有动态属性添加到域中以对其进行序列化?Object.properties()不返回它。我找不到任何其他方法返回它。我现

我正在尝试使用Grail的MongoDB插件将通用JSONObject保存到域对象。基本上,它不适用于常规属性(这并不奇怪)。因此,我添加了一个动态属性,它将JSONObject保存到DB并将其拉出(耶)。但是,由于我用Jackson serializer替换了默认的JSON序列化程序(由于MongoDB插件和域对象的不良行为),所以动态属性没有被序列化

我可以使用什么API将所有动态属性添加到域中以对其进行序列化?Object.properties()不返回它。我找不到任何其他方法返回它。我现在必须修改Jackson来序列化Grails对象。你知道怎么做最简单吗

这是我的目标:

class ProblemAttempt {

   static final STEP_GUIDED = 'guided'
   static final STEP_INDEPENDENT = 'independent'

   static constraints = {
       timeSpent nullable: true
   }

   static mapWith="mongo"

   static mapping = {
       lessonAttemptId index: true
   }

   static embedded = ['tags']

   ObjectId id
   ObjectId problemId
   ObjectId userId
   String lessonExternalId
   ObjectId lessonAttemptId
   Date timeAnswered
   String stepName
   Boolean correct
   Integer timeSpent
   String lessonStatus
   List<String> tags

   ProblemAttempt(User user, String lessonExternalId, LessonAttempt attempt, String stepName, ObjectId problemId, boolean correct, Object answer) {

      this.userId = user.id
      this.lessonExternalId = lessonExternalId
      this.correct = correct
      this.lessonAttemptId = attempt.id
      this.lessonStatus = LearningStatus.INCOMPLETE
      this.problemId = problemId
      this.stepName = stepName
      this.timeAnswered = new Date()
      this['answer'] = answer  // have to use dynamic properties to persist generic JSON objects

      tags = []
      user.aspects.each {ProfileAspect aspect ->
          tags << aspect.class.simpleName
      }

      user.groups.each {DomainReference group ->
          tags << group.name
      }
  }

  public Object getUserAnswered() {
      return this['answer'] // this was added to handle serializing into json
  }

}
类问题尝试{
静态最终步骤_GUIDED='GUIDED'
静态最终步骤_独立=‘独立’
静态约束={
TimePent可为空:true
}
静态mapWith=“mongo”
静态映射={
lessonAttemptId指数:真
}
静态嵌入=['tags']
对象id
目标问题
ObjectId用户标识
弦乐
目的性轻奏鸣音
答复日期和时间
字符串步骤名
布尔正确
整数时间开销
弦乐状态
列表标签
ProblemEntry(用户用户用户、字符串lessonExternalId、LessonAttempt尝试、字符串步骤名、ObjectId problemId、布尔正确、对象答案){
this.userId=user.id
this.lessonExternalId=lessonExternalId
这是正确的
this.lessonAttemptId=trust.id
this.lessonStatus=LearningStatus.complete
this.problemId=problemId
this.stepName=stepName
this.timeAnswered=新日期()
此['answer']=answer//必须使用动态属性来持久化通用JSON对象
标签=[]
user.aspects.each{ProfileAspect->
标签

标签通常是Map或List类型的固定属性(取决于JSON的性质)这里应该没问题。只需确保您保存的是java集合,而不是Jackson对象。在过去,当我尝试执行MongoDB无法处理集合中的集合之类的操作时,后者无法按1:1进行序列化。因此列表将不起作用。它将保存列表,其中没有任何内容或列表具有空映射。这是因为MongoDB插件在处理多态性和类型方面的糟糕设计。你能为域对象(动态属性)添加一个例子吗?我添加了对象,您可以看到动态属性以及我的解决方案,即添加一个不同的getter,序列化程序将使用该getter将对象发送到客户端。但是,此getter不会保存到DB,因为MongoDB忽略它,因为它未嵌入。此解决方案的问题是我似乎无法使用动态p单元测试中的属性。我曾尝试迁移到集成测试,但也失败了。因此,我仍然有兴趣找到一个不使用动态属性的解决方案。