我正在尝试使用Spring MVC创建一个REST服务,如果我返回一个普通的字符串,它正在工作 . 我的要求是返回Java对象的JSON字符串 . 不知道如何通过隐式转换实现这一点 .
这是我的代码:
StudentService.java
package com.spring.schoolmanagement.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.spring.schoolmanagement.dao.CourseDAOImpl;
import com.spring.schoolmanagement.dao.StateDAOImpl;
import com.spring.schoolmanagement.dao.StudentDAOImpl;
import com.spring.schoolmanagement.model.Student;
@Controller
@RequestMapping("/rest/student")
public class StudentService {
@Autowired
private CourseDAOImpl courseService;
@Autowired
private StudentDAOImpl studentService;
@Autowired
private StateDAOImpl stateService;
@RequestMapping(value = "/{id}", method = RequestMethod.GET, headers = "Accept=*/*")
@ResponseBody
public Student home(@PathVariable int id) {
return this.studentService.getById(id);
}
@RequestMapping(method = RequestMethod.GET, headers = "Accept=*/*")
@ResponseBody
public List<Student> getAll() throws Exception {
return this.studentService.getAll();
}
@RequestMapping(value = "/test", method = RequestMethod.GET, headers = "Accept=*/*")
@ResponseBody
public String test() {
return "Test REST Service!!!";
}
}
Student.java
package com.spring.schoolmanagement.model;
import java.util.Date;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
public class Student extends Contact{
private int id;
@NotEmpty
@Size(max = 30)
private String firstName, lastName;
//private String lastName;
@DateTimeFormat(pattern="MM/dd/yyyy")
private Date DOB, DOA;
//private Date DOA;
@NotEmpty
@Email
private String email;
private String password;
private int courseID;
private String courseName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public Date getDOB() {
return DOB;
}
public void setDOB(Date dOB) {
DOB = dOB;
}
public Date getDOA() {
return DOA;
}
public void setDOA(Date dOA) {
DOA = dOA;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getCourseID() {
return courseID;
}
public void setCourseID(int courseID) {
this.courseID = courseID;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
}
这里 http://localhost:8080/schoolmangement/rest/student/test 网址正在返回"Test REST Service!!!"
但是, http://localhost:8080/schoolmangement/rest/student/1 URL抛出HTTP状态代码406并显示错误消息:
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.
5 回答
最后,我使用Jackson库和Spring MVC获得了解决方案 . 我从Journal Dev(http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program)的例子中得到了这个解决方案
所以,我所做的代码更改是:
在Maven中包含库 .
将JSON转换Servlet添加到servlet-context.xml中 .
将模型更改为Serializable .
我没有对我的REST服务控制器进行任何更改 . 默认情况下,它会转换为JSON .
您始终可以在Web方法上方添加
@Produces("application/json")
或指定produces="application/json"
以返回json . 然后在Student
类的顶部,您可以从javax.xml.bind.annotation
包中添加@XmlRootElement
.请注意,直接返回模型类可能不是一个好主意 . 只是一个建议 .
HTH .
Json转换应该是开箱即用的 . 为了实现这一点,您需要添加一些简单的配置:
首先将contentNegotiationManager添加到spring配置文件中 . 它负责协商响应类型:
然后在服务的类路径中添加 Jackson2 jars(jackson-databind和jackson-core) . Jackson 负责将数据序列化为JSON . Spring会自动检测这些并自动初始化 MappingJackson2HttpMessageConverter . 只有这个配置我有自动转换为JSON工作 . 如果设置 accept:application/xml 标头,所描述的配置还有一个额外的好处,即可以序列化为XML .
当控制器正确注释时,Spring框架本身处理json转换 .
例如:
这里spring在内部将UpdateResponse对象转换为相应的json字符串并返回它 . 为了做到这一点,内部使用了Jackson library.
如果在控制器之外的任何地方需要模型对象的json表示,那么可以使用jackson提供的objectMapper . 模型应该正确注释,以便工作 .
例如:
另一个简单的解决方案是在POM中添加jackson-databind依赖项 .
保持其余代码不变 .