【问题标题】:Missing Parent Tag in JSON Response in Jersey泽西岛的 JSON 响应中缺少父标记
【发布时间】:2015-07-25 20:29:30
【问题描述】:

我在 Jetty 中运行我的 REST 服务(Jersey)。当我在 Response 中使用 XML 媒体类型调用 REST 方法时,它工作正常,但是当媒体类型为 JSON 时,父标签是 missing 来自 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 的屏幕截图:

【问题讨论】:

  • “父标签”是指{ "all_student_session_info" : {...} }
  • @peeskillet 感谢您的评论。我已经更新了问题。是的,缺少父标签“all_student_session_info”。您能帮我解决这个问题吗?
  • Jackson,您使用的是什么 JSON 提供程序?

标签: json rest jersey jetty jax-rs


【解决方案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 注释自动注册(如果我们正在扫描包),或者您需要显式注册它。

【讨论】:

  • 感谢您的帮助。我已经实现了提供程序并在春季注册了它。我得到 MIME 媒体类型应用程序/json 未找到。现在是错误。你能告诉我我错过了什么吗?
  • 我需要查看您的球衣配置并查看您正在使用的 Jackson 提供程序依赖项。一般来说,仅仅添加 ContextResolver 应该不会导致此类问题
  • 你是独立添加jar还是使用Maven?我还需要看看你的 Jersey 配置。
  • 尝试从here 中添加您缺少的两个,然后删除jersey-json。然后注册JacksonJaxbJsonProvider。你应该在jackson-jaxrs-json-provider jar 中找到它。
  • 我有一个问题。如果我将媒体类型更改为 application/x-www-form-urlencoded 它抱怨 MIME 媒体类型 application/x-www-form-urlencoded 未找到但我已添加方法的媒体类型。请问需要做什么才能解决它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2015-01-05
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多