我正在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"
}
]
}
答案 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>