泽西岛JSON响应中缺少父标记

时间:2015-07-25 20:29:31

标签: json rest jersey jetty jax-rs

我正在Jetty中运行我的REST服务(Jersey)。当我在Response中使用XML媒体类型调用REST方法时它工作正常但是当媒体类型为JSON时,json中的父标记缺失响应。有人可以帮我解决问题吗?

提前致谢。 资源类是:

    public class Service {

        @Autowired
        private StudentDao studentDao;


        @Autowired
        private TutorDao tutorDaoImpl;

        @GET
        @Produces({MediaType.APPLICATION_JSON})
        @Path("/{tutorId}")
        public AllStudentSession getAllStudentForTutor(
                @PathParam("tutorId") final String tutorId) {
            return tutorDaoImpl.getAllAssignedStudent(tutorId);

        }
    }


@XmlRootElement(name = "all_student_session_info")
public class AllStudentSession {
    private List<StudentSessionsResp> allStudentAssigned;

    @XmlElement(name = "allStudentAssigned")
    public List<StudentSessionsResp> getAllStudentAssigned() {
        return allStudentAssigned;
    }

    public void setAllStudentAssigned(
            List<StudentSessionsResp> allStudentAssigned) {
        this.allStudentAssigned = allStudentAssigned;
    }

}

@XmlRootElement(name = "assigned_students_tutor")
public class StudentSessionsResp {
    private String childId;
    private String childName;
    private String parentName;
    private String subject;
    private String grade;
    private String phoneNumber;
    private AddressResp address;
    private String email;

    @XmlElement(name = "childId")
    public String getChildId() {
        return childId;
    }

    @XmlElement(name = "parentName")
    public String getParentName() {
        return parentName;
    }

    @XmlElement(name = "subject")
    public String getSubject() {
        return subject;
    }

    @XmlElement(name = "grade")
    public String getGrade() {
        return grade;
    }

    @XmlElement(name = "phoneNumber")
    public String getPhoneNumber() {
        return phoneNumber;
    }
    @XmlElement(name = "studentName")
    public String getChildName() {
        return childName;
    }
    @XmlElement(name = "address")
    public AddressResp getAddress() {
        return address;
    }
    @XmlElement(name = "email")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setChildName(String childName) {
        this.childName = childName;
    }

    public void setAddress(AddressResp address) {
        this.address = address;
    }

    public void setChildId(String childId) {
        this.childId = childId;
    }
    public void setParentName(String parentName) {
        this.parentName = parentName;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public void setGrade(String grade) {
        this.grade = grade;
    }
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }


}

所需的输出是:

{
  "all_student_session_info": {
    "allStudentAssigned": [
      {
        "address": {
          "city": "testcity",
          "country": "testcountry",
          "houseNumber": "10",
          "pinCode": "123456",
          "state": "teststate"
        },
        "childId": "55b009ab4f48f6da3a135bcc",
        "studentName": "Testname",
        "email": "testmail",
        "parentName": "testname",
        "phoneNumber": "123456789"
      },
      {
        "address": {
          "city": "testcity",
          "country": "testcountry",
          "houseNumber": "10",
          "pinCode": "123456",
          "state": "teststate"
        },
        "childId": "55b3e2114f482e535a109366",
        "studentName": "Testname",
        "email": "testmail",
        "parentName": "testname",
        "phoneNumber": "123456789"
      }
    ]
  }
}

我得到的输出是:

{
    "allStudentAssigned": [
      {
        "address": {
          "city": "testcity",
          "country": "testcountry",
          "houseNumber": "10",
          "pinCode": "123456",
          "state": "teststate"
        },
        "childId": "55b009ab4f48f6da3a135bcc",
        "studentName": "Testname",
        "email": "testmail",
        "parentName": "testname",
        "phoneNumber": "123456789"
      },
      {
        "address": {
          "city": "testcity",
          "country": "testcountry",
          "houseNumber": "10",
          "pinCode": "123456",
          "state": "teststate"
        },
        "childId": "55b3e2114f482e535a109366",
        "studentName": "Testname",
        "email": "testmail",
        "parentName": "testname",
        "phoneNumber": "123456789"
      }
    ]
  }

以下是我正在使用的jar的屏幕截图: enter image description here

1 个答案:

答案 0 :(得分:1)

默认情况下,Jackson不会使用根名称包装JSON对象,因为您期望我们可以将其配置为执行此操作。我们可以通过配置杰克逊的ObjectMapper

来做到这一点
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
// maintain JAXB annotation support
mapper.registerModule(new JaxbAnnotationModule());

要配置Jersey应用程序以使用此ObjectMapper,我们可以创建ContextResolver,如here所示。根据您的应用程序设置注册资源和提供程序的方式,ObjectMapperContextResolver将自动注册@Provider注释(如果我们正在扫描包),或者您需要明确注册它。 / p>