Spring RestController: Wie verwendet man es?

Die Spring RestController Annotation ist eine bequeme Annotation, die selbst mit @Controller und @ResponseBody annotiert ist. Diese Annotation wird auf eine Klasse angewendet, um sie als Anfragehandler zu markieren. Die Spring RestController Annotation wird verwendet, um RESTful Web Services mit Spring MVC zu erstellen. Spring RestController kümmert sich um die Zuordnung von Anfragedaten zur definierten Anfragehandler-Methode. Sobald der Antworttext von der Handlermethode generiert wird, konvertiert er ihn in eine JSON- oder XML-Antwort.

Spring RestController Beispiel

Lassen Sie uns sehen, wie einfach wir RestController verwenden können, um einen REST-Webdienst in Spring zu erstellen. Wir werden die Spring Repository-Implementierung wiederverwenden und einen RESTful-Webservice erstellen. Wir werden eine eigenständige Webanwendung erstellen und hier nicht Spring Boot verwenden. Wir werden auch unsere APIs so aussetzen, dass sie sowohl JSON als auch XML in Anfrage und Antwort unterstützen. Das folgende Bild zeigt unsere endgültige Projektstruktur.

Modell- und Repository-Klassen werden bereits im Spring Repository Tutorial bereitgestellt. Wir werden uns hier mehr auf die Implementierung von RestController konzentrieren.

Spring RestController Maven-Abhängigkeiten

Lassen Sie uns einen Blick auf die Abhängigkeiten werfen, die benötigt werden, um unser Spring RestController-Beispielprojekt zu erstellen.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>

<!-- Jackson für REST JSON-Unterstützung -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
</dependency>
<!-- JAXB für XML-Antwort, ab Java 9 explizit zu definieren -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.0</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>javax.activation-api</artifactId>
    <version>1.2.0</version>
</dependency>

Wir benötigen Spring MVC, Jackson und JAXB Bibliotheken, um sowohl XML- als auch JSON-Anfragen und -Antworten von unserem REST-Webdienst zu unterstützen. Unsere web.xml Datei wird verwendet, um Spring MVC DispatcherServlet als Front-Controller zu konfigurieren. Lassen Sie uns jetzt die Spring Context-Datei ansehen.

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
    xmlns="https://www.springframework.org/schema/mvc"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="https://www.springframework.org/schema/beans"
    xmlns:context="https://www.springframework.org/schema/context"
    xsi:schemaLocation="https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Aktiviert das Spring MVC @Controller Programmiermodell -->
    <annotation-driven />

    <context:component-scan
        base-package="com.journaldev.spring" />

    <beans:bean id="jsonMessageConverter"
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
    <beans:bean id="xmlMessageConverter"
        class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />

    <beans:bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <beans:property name="messageConverters">
            <beans:list>
                <beans:ref bean="jsonMessageConverter" />
                <beans:ref bean="xmlMessageConverter" />
            </beans:list>
        </beans:property>
    </beans:bean>

</beans:beans>

Der wichtigste Teil sind die jsonMessageConverter und xmlMessageConverter Beans, die in der messageConverters-Eigenschaft des RequestMappingHandlerAdapter definiert und gesetzt sind. Das ist alles, was nötig ist, um Spring zu sagen, dass wir wollen, dass unsere Anwendung sowohl JSON als auch XML unterstützt und dass diese Beans für die Umwandlung verwendet werden sollen.

Spring RestController Klasse

Hier ist unsere Implementierung der Spring RestController-Klasse.

package com.journaldev.spring.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import com.journaldev.spring.model.Employee;
import com.journaldev.spring.repository.EmployeeRepository;

@RestController
public class EmployeeRestController {

    @Autowired
    private EmployeeRepository repository;
    
    @GetMapping("/rest/employee/get/{id}")
    public Employee getEmployeeByID(@PathVariable("id") int id) {
        return repository.retrieve(id);
    }
    
    @GetMapping("/rest/employee/getAll")
    public List<Employee> getAllEmployees() {
        return repository.getAll();
    }

    @PostMapping("/rest/employee/create")
    public Employee createEmployee(@RequestBody Employee emp) {
        repository.store(emp);
        return emp;
    }
    
    @GetMapping("/rest/employee/search/{name}")
    public Employee getEmployeeByName(@PathVariable("name") String name) {
        return repository.search(name);
    }
    
    @DeleteMapping("/rest/employee/delete/{id}")
    public Employee deleteEmployeeByID(@PathVariable("id") int id) {
        return repository.delete(id);
    }
}

Beachten Sie, dass wir hier nur unsere REST-APIs definiert haben, die gesamte Geschäftslogik ist Teil der Repository-Klasse…

Accept und Content-Type Anfrage-Header

Wir haben unsere REST-Anwendung so konfiguriert, dass sie sowohl mit XML als auch JSON funktioniert. Also wie wird sie wissen, ob die Anfrage XML oder JSON ist, und ob die Antwort im JSON- oder XML-Format gesendet werden soll. Hier kommen die Accept- und Content-Type Anfrage-Header ins Spiel. Content-Type: Definiert den Typ des Inhalts im Anfragekörper, wenn sein Wert “application/xml” ist, dann wird Spring den Anfragekörper als XML-Dokument behandeln. Wenn sein Wert “application/json” ist, wird der Anfragekörper als JSON behandelt. Accept: Definiert den Typ des Inhalts, den der Client als Antwort erwartet. Wenn sein Wert “application/xml” ist, wird eine XML-Antwort gesendet. Wenn sein Wert “application/json” ist, wird eine JSON-Antwort gesendet.

Spring RestController Test

Unsere Anwendung ist bereit für einen Test, ich habe sie auf Tomcat-9 bereitgestellt und teste mit Postman. Unten sind die Testergebnisse mit Erklärung.

Spring RestController GET JSON-Antwort

Es ist eine einfache GET-Anfrage, der wichtige Punkt ist der Wert des “Accept”-Headers.

Spring RestController GET XML-Antwort

Wenn wir den Wert des “Accept”-Headers auf “application/xml” ändern, erhalten wir eine XML-Antwort.

Spring RestController GET Liste

Lassen Sie uns versuchen, die API aufzurufen, um eine Liste von Mitarbeitern zu erhalten. Wir erhalten eine Liste von Elementen in JSON mit einem anonymen Wurzelelement. Da XML keine anonymen Wurzelelemente unterstützt, erhalten wir eine Ausnahmemeldung.

Spring RestController POST

Spring RestController POST mit JSON-Anfrage und -Antwort

Spring RestController POST mit JSON-Anfragekörper

Spring RestController POST mit JSON-Anfrage und XML-Antwort

Spring RestController DELETE

Zusammenfassung

Spring RestController hilft uns, uns auf die Geschäftslogik zu konzentrieren, indem er sich um alle Boilerplate-Arbeiten für die Erstellung von REST-Webdienst-APIs kümmert.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: