wake-up-neo.net

Konvertieren Sie ein Objekt in JSON in REST Service von Spring MVC

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.

9
Roul

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:

  • Schließen Sie die Bibliothek in Maven ein.
  • Fügen Sie das JSON-Konvertierungsservlet in servlet-context.xml hinzu.
  • Ändern Sie das Modell in Serializable.

Ich habe an meinem REST Service Controller keine Änderungen vorgenommen. Standardmäßig wird es in JSON konvertiert.

6
Roul

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.

5
Gyan


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.

1
Boyan

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);
0
Sudip Bhandari

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.

0
PraBhu