Convertir un objet en JSON dans le RESTE du service par Spring MVC
Je suis en train de créer un service REST à l'aide de Spring MVC et ça fonctionne si je retourne une chaîne simple. Mon exigence est de retourner une chaîne JSON de l'objet Java. Ne sais pas comment faire pour l'obtenir par conversion implicite.
Voici mon 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;
}
}
Ici http://localhost:8080/schoolmangement/rest/student/test URL est de retour "Test de REPOS!!!"
Mais, http://localhost:8080/schoolmangement/rest/student/1 URL jeter le code d'État HTTP 406 avec le message d'erreur:
La ressource identifiée par cette demande est seulement capable de générer des réponses avec des caractéristiques pas acceptable en fonction de la demande "accepter" les en-têtes.
headers = "Accept=*/*"
, mais vous devez spécifier produces = "application/json"
Votre configuration Spring n'a probablement pas inclure une Jackson mappeur. L'utilisation de Ressort de Démarrage pour la configuration, qui va configurer automatiquement, et si vous n'êtes pas à l'aide d'un découplé DTO pour votre API externe de la représentation, envisager de Données du Printemps de REPOS.
Oui, vous avez raison. J'ai finalement trouvé la solution.
OriginalL'auteur Roul | 2015-03-16
Vous devez vous connecter pour publier un commentaire.
J'ai finalement trouvé la solution à l'aide de Jackson bibliothèque avec Spring MVC. J'ai eu cette solution à partir d'un exemple de Journal de Dev( http://www.journaldev.com/2552/spring-restful-web-service-example-with-json-jackson-and-client-program )
Donc, le code des changements que j'ai fait sont:
Je n'ai pas apporté des modifications à mon REPOS contrôleur de service. Par défaut, il se transforme en JSON.
OriginalL'auteur Roul
Vous pouvez toujours ajouter la
@Produces("application/json")
au-dessus de votre méthode web ou spécifierproduces="application/json"
de retour json. Puis sur le dessus de laStudent
classe, vous pouvez ajouter@XmlRootElement
dejavax.xml.bind.annotation
paquet.Veuillez noter, il pourrait ne pas être une bonne idée de retourner directement classes de modèle. Juste une suggestion.
HTH.
Aujourd'hui - et Nous n'avons même pas besoin d'annoter des classes. Suffit de jackson sur le chemin de classe et retour le POJO, une liste de POJO, une Carte contenant les pojo de la valeur et il fonctionne toujours.
OriginalL'auteur Gyan
Le Json de conversion devrait fonctionner hors de la boîte. Pour que cela arrive, vous devez ajouter certaines des configurations simples:
Tout d'abord ajouter un contentNegotiationManager dans votre ressort fichier de configuration. Il est responsable de la négociation de la réponse type:
Puis ajouter Jackson2 pots (jackson-databind et jackson-core) dans le service du chemin de classe. Jackson est responsable de la sérialisation des données en JSON. Le printemps va détecter ces et d'initialiser le MappingJackson2HttpMessageConverter automatiquement pour vous.
Avoir plus que ce configuré, j'ai ma conversion automatique en JSON de travail. L'décrit config a un avantage supplémentaire de vous donner la possibilité de sérialiser XML si vous définissez accept:application/xml en-tête.
OriginalL'auteur Boyan
Spring framework lui-même les poignées de json de conversion lorsque le contrôleur est correctement annoté.
Pour exemple:
Ici du printemps à l'interne convertit le UpdateResponse objet correspondant de la chaîne json et le renvoie. Pour ce faire, il ressort utilise en interne Jackson bibliothèque.
Si vous avez besoin d'une représentation json d'un modèle objet n'importe où en dehors de contrôleur ensuite, vous pouvez utiliser objectMapper fournis par jackson. Le modèle devrait être correctement annoté pour que cela fonctionne.
Par exemple:
OriginalL'auteur Sudip Bhandari
Une solution simple est d'ajouter jackson-databind dépendance dans le POM.
Garder le Reste du code tel qu'il est.
OriginalL'auteur PraBhu