Mongodb JSON对象、动态属性和序列化(使用Grails&;蒙哥达
我正在尝试使用Grail的MongoDB插件将通用JSONObject保存到域对象。基本上,它不适用于常规属性(这并不奇怪)。因此,我添加了一个动态属性,它将JSONObject保存到DB并将其拉出(耶)。但是,由于我用Jackson serializer替换了默认的JSON序列化程序(由于MongoDB插件和域对象的不良行为),所以动态属性没有被序列化 我可以使用什么API将所有动态属性添加到域中以对其进行序列化?Object.properties()不返回它。我找不到任何其他方法返回它。我现在必须修改Jackson来序列化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()不返回它。我找不到任何其他方法返回它。我现
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单元测试中的属性。我曾尝试迁移到集成测试,但也失败了。因此,我仍然有兴趣找到一个不使用动态属性的解决方案。