Ich versuche, einen REST -Dienst mit Spring MVC zu erstellen, und es funktioniert, wenn ich eine einfache Zeichenfolge zurücksende. Meine Anforderung ist, eine JSON-Zeichenfolge des Java-Objekts zurückzugeben. Ich weiß nicht, wie Sie dies durch implizite Konvertierung erreichen können.
Hier ist mein Code:
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;
}
}
Hier http: // localhost: 8080/schoolmangement/rest/student/test URL gibt "Test REST Service !!!" zurück.
http: // localhost: 8080/schoolmangement/rest/student/1 URL, die den HTTP-Statuscode 406 mit Fehlermeldung auslöst:
Die von dieser Anforderung identifizierte Ressource kann nur Antworten generieren, deren Eigenschaften aufgrund der Header der Anforderung "Accept" nicht akzeptabel sind.
Endlich bekam ich eine Lösung mit der Jackson-Bibliothek zusammen mit Spring MVC. Ich habe diese Lösung aus einem Beispiel von Journal Dev ( http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program )
Ich habe also folgende Code-Änderungen vorgenommen:
Ich habe an meinem REST Service Controller keine Änderungen vorgenommen. Standardmäßig wird es in JSON konvertiert.
Sie können immer @Produces("application/json")
über Ihrer Webmethode hinzufügen oder produces="application/json"
angeben, um json zurückzugeben. Dann können Sie zusätzlich zur Student
-Klasse @XmlRootElement
aus dem javax.xml.bind.annotation
-Paket hinzufügen.
Bitte beachten Sie, dass es möglicherweise keine gute Idee ist, Modellklassen direkt zurückzugeben. Nur ein Vorschlag.
HTH.
Die Json-Konvertierung sollte sofort funktionieren. Dazu müssen Sie einige einfache Konfigurationen hinzufügen:
Fügen Sie zunächst einen contentNegotiationManager in Ihre Spring-Konfigurationsdatei ein. Es ist für die Aushandlung des Antworttyps verantwortlich:
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="favorParameter" value="true" />
<property name="ignoreAcceptHeader" value="true" />
<property name="useJaf" value="false" />
<property name="defaultContentType" value="application/json" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
</bean>
<mvc:annotation-driven
content-negotiation-manager="contentNegotiationManager" />
<context:annotation-config />
Fügen Sie dann Jackson2 jars (jackson-databind und jackson-core) im Klassenpfad des Dienstes hinzu. Jackson ist für die Datenserialisierung nach JSON verantwortlich. Spring wird diese erkennen und den MappingJackson2HttpMessageConverter automatisch für Sie initialisieren. Nachdem ich nur diese konfiguriert habe, habe ich meine automatische Umwandlung in JSON. Die beschriebene Konfiguration bietet den zusätzlichen Vorteil, dass Sie die Möglichkeit haben, in XML zu serialisieren, wenn Sie accept: application/xml header setzen.
Spring Framework selbst übernimmt die Json-Konvertierung, wenn der Controller ordnungsgemäß kommentiert wird.
Für zB:
@PutMapping(produces = {"application/json"})
@ResponseBody
public UpdateResponse someMethod(){ //do something
return UpdateResponseInstance;
}
Hier konvertiert spring intern das UpdateResponse-Objekt in den entsprechenden json-String und gibt ihn zurück. Der Frühling verwendet intern die Jackson-Bibliothek.
Wenn Sie eine json-Darstellung eines Modellobjekts außerhalb des Controllers benötigen, können Sie den von jackson bereitgestellten objectMapper verwenden. Das Modell sollte ordnungsgemäß kommentiert werden, damit dies funktioniert.
Z.B:
ObjectMapper mapper = new ObjectMapper();
SomeModelClass someModelObject = someModelRepository.findById(idValue).get();
mapper.writeValueAsString(someModelObject);
Eine weitere einfache Lösung besteht darin, die Abhängigkeit von Jackson-Datenbindungen in POM hinzuzufügen.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.1</version>
</dependency>
Behalten Sie den Rest des Codes, wie er ist.