简体   繁体   中英

How to Model class using Spring Data Mongo DB to store nested JSON document with varying length of fields and type

I'm new to Spring Boot and Mongo DB, I am trying to model POJO classes - 'Patient' and 'Survey' which should store and persist patient survey data. The survey data will come to us from a 3'rd party as JSON and it contains arbitrary no. of questions and answers and arbitrary types as well.

What data type/annotation should I use to store the nested JSON as a single entity/object ? I heard that Mongo DB stores the JSON as BSON. But how can I do it ?

Currently My model classes looks like this

@Document
public class Patient {

    @Id private String id;


    private String pID;
    private String firstName;
    private String lastName;

    @DBRef
    private List<Survey> surveys;

    public Patient() { }

    public Patient(String fName, String lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }

    public String getpID() {
        return pID;
    }

    public void setpID(String pID) {
        this.pID = pID;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}



@Document
public class Survey {

    @Id private String id;

    private String pID;

    private Document surveyData;

    public Survey(String pID, Document surveyData)
    {
        this.pID = pID;
        this.surveyData = surveyData;
    }

    public String getpID() {
        return pID;
    }

    public void setpID(String pID) {
        this.pID = pID;
    }

    public Document getSurveyData() {
        return surveyData;
    }

    public void setSurveyData(Document surveyData) {
        this.surveyData = surveyData;
    }

}

@RepositoryRestResource(collectionResourceRel = "Survey", path = "survey")
public interface SurveyRepository extends MongoRepository<Survey, String> {

    public Survey findBypID(@Param("pID") String pID);

}

Here is the JSON I'm using to test this.

{
"pID": "test1",
"surveyData" : {
  "resourceType": "QuestionnaireResponse",
  "questionnaire": {
    "reference": "http://hl7.org/fhir/2016Sep/cqif/questionnaire-cqif-example.xml.html"
  },
  "item": [
    {
      "linkId": "Q1",
      "text": "Little interest or pleasure in doing things",
      "answer": [
        {
          "valueString": "Several Days"
        }
      ]
    },
    {
      "linkId": "Q2",
      "text": "Feeling down, depressed, or hopeless",
      "answer": [
        {
          "valueString": "Several Days"
        }
      ]
    },
    {
      "linkId": "Q3",
      "text": "Trouble falling or staying asleep",
      "answer": [
        {
          "valueString": "Several Days"
        }
      ]
    },
    {
      "linkId": "Q4",
      "text": "Feeling tired or having little energy",
      "answer": [
        {
          "valueString": "More than half days"
        }
      ]
    },
    {
      "linkId": "Q5",
      "text": "Poor appetite or overeating",
      "answer": [
        {
          "valueString": "Several Days"
        }
      ]
    },
    {
      "linkId": "Q6",
      "text": "Feeling bad about yourself - or that you are a failure or have let yourself or your family      down",
      "answer": [
        {
          "valueString": "More than half days"
        }
      ]
    },
    {
      "linkId": "Q7",
      "text": "Trouble concentrating on things, such as reading the newspaper or watching television",
      "answer": [
        {
          "valueString": "Several Days"
        }
      ]
    },
    {
      "linkId": "Q8",
      "text": "Moving or speaking so slowly that other people could have noticed. Or the opposite - being      so fidgety or restless that you have been moving around a lot more than usual",
      "answer": [
        {
          "valueString": "More than half days"
        }
      ]
    },
    {
      "linkId": "Q9",
      "text": "If you checked off any problems, how difficult have these problems made it for you to      do your work, take care of things at home, or get along with other people",
      "answer": [
        {
          "valueString": "Several Days"
        }
      ]
    }
  ]
}

}

The exception I'm getting is

2017-03-15 17:18:19.257 ERROR 15364 --- [nio-8080-exec-3] o.s.d.r.w.RepositoryRestExceptionHandler : Could not read document: Can not deserialize Class org.springframework.data.mongodb.core.mapping.Document (of type annotation) as a Bean
 at [Source: org.apache.catalina.connector.CoyoteInputStream@5d3981f6; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize Class org.springframework.data.mongodb.core.mapping.Document (of type annotation) as a Bean
 at [Source: org.apache.catalina.connector.CoyoteInputStream@5d3981f6; line: 1, column: 1]

By Changing the data type for surveyData to 'Object' now I am able to store the embedded JSON object in Java model class.

Seems 'Document' as a type is not valid as it's an annotation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM