Rou*_*oul 13 java rest spring json spring-mvc
我正在尝试使用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!!!";
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这里http:// localhost:8080/schoolmangement/rest/student/test URL正在返回"测试REST服务!!!"
但是,http:// localhost:8080/schoolmangement/rest/student/1 URL抛出HTTP状态代码406并显示错误消息:
由该请求标识的资源仅能够根据请求"接受"报头生成具有不可接受的特性的响应.
最后,我使用Jackson库和Spring MVC获得了解决方案.我从Journal Dev的一个例子中得到了这个解决方案(http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program )
所以,我所做的代码更改是:
我没有对我的REST服务控制器进行任何更改.默认情况下,它会转换为JSON.
您始终可以添加@Produces("application/json")
上面的Web方法或指定produces="application/json"
返回json.然后在Student
课程的顶部,您可以@XmlRootElement
从javax.xml.bind.annotation
包中添加.
请注意,直接返回模型类可能不是一个好主意.只是一个建议.
HTH.
当控制器正确注释时,Spring 框架本身会处理 json 转换。
例如:
@PutMapping(produces = {"application/json"})
@ResponseBody
public UpdateResponse someMethod(){ //do something
return UpdateResponseInstance;
}
Run Code Online (Sandbox Code Playgroud)
这里spring内部将UpdateResponse对象转换为对应的json字符串并返回。为了做到这一点,Spring 在内部使用Jackson 库。
如果您需要除控制器之外的任何地方的模型对象的 json 表示,那么您可以使用 jackson 提供的 objectMapper。模型应该正确注释才能工作。
例如:
ObjectMapper mapper = new ObjectMapper();
SomeModelClass someModelObject = someModelRepository.findById(idValue).get();
mapper.writeValueAsString(someModelObject);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
91475 次 |
最近记录: |