2014-03-01 75 views
0

我想通過使用Grail的MongoDB插件將通用JSONObject保存到域對象。基本上它不適用於常規屬性(不奇怪)。所以我添加了一個動態屬性,將JSONObject保存到數據庫並將其拉回(yay)。但是,由於我用Jackson序列化程序替換了默認的JSON序列化程序(由於MongoDB Plugin和Domain對象的不良行爲),動態屬性未被序列化。JSON對象,動態屬性和序列化與Grails和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 
    } 

} 
+1

你可以添加一個例子,你現在有什麼域對象(動態屬性)? – dmahapatro

+0

我添加了該對象,並且您可以看到動態屬性以及我的解決方案,該解決方案將添加一個不同的getter,供序列化程序用來將該對象發送到客戶端。但是,這個getter不會被保存到數據庫中,因爲MongoDB沒有嵌入它,所以忽略它。 – chubbsondubs

+0

這個解決方案的問題是我似乎無法在單元測試中使用動態屬性。我試圖遷移到集成測試,但也失敗了。所以我仍然有興趣找到一個不使用動態屬性的解決方案。 – chubbsondubs

回答

0

一般類型地圖或列表(取決於您的JSON的性質)的固定屬性應該是在這裏很好。只要確保你保存了java集合,而不是Jackson對象。後者不能被BSON序列化1到1

+1

在過去,當我嘗試做這樣的事情時,MongoDB無法處理集合中的集合。所以List >將不起作用。它將保存List,其中不包含任何內容,或者列表中包含空白地圖。這是因爲MongoDB插件對處理多態性和打字的糟糕設計。 – chubbsondubs