Spring RestController

Spring RestController-Annotation ist eine Komfortannotation, die selbst mit @Controller und @ResponseBody annotiert ist. Diese Annotation wird auf eine Klasse angewendet, um sie als Anforderungsverarbeiter zu kennzeichnen. Die Spring RestController-Annotation wird verwendet, um RESTful Webdienste mit Spring MVC zu erstellen. Der Spring RestController kümmert sich um die Zuordnung von Anforderungsdaten zur definierten Methode des Anforderungsverarbeiters. Sobald der Antwortkörper aus der Handlermethode generiert wurde, wandelt er ihn in eine JSON- oder XML-Antwort um.

Beispiel für Spring RestController

Lassen Sie uns sehen, wie einfach wir RestController verwenden können, um einen REST-Webdienst in Spring zu erstellen. Wir werden die Implementierung des Spring Repository wiederverwenden und einen RESTful-Webservice erstellen. Wir werden eine eigenständige Webanwendung erstellen und hier kein Spring Boot verwenden. Wir werden auch unsere APIs freigeben, um sowohl JSON als auch XML in Anforderung und Antwort zu unterstützen. Das unten stehende Bild zeigt unsere endgültige Projektstruktur. Modell- und Repository-Klassen sind bereits im Spring Repository-Tutorial bereitgestellt. Hier werden wir uns mehr auf die Implementierung des RestControllers konzentrieren.

Frühling RestController Maven Abhängigkeiten

Lassen Sie uns einen Blick auf die Abhängigkeiten werfen, die erforderlich sind, um unser Beispielprojekt für den Spring RestController 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 for REST JSON Support -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.6</version>
</dependency>
<!-- JAXB for XML Response, needed to explicitly define from Java 9 onwards -->
<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 die 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 den Spring MVC DispatcherServlet als Front-Controller zu konfigurieren. Schauen wir uns jetzt die Spring-Kontextdatei an.

<?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">

	<!-- Enables the Spring MVC @Controller programming model -->
	<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 im RequestMappingHandlerAdapter messageConverters Eigenschaft definiert und festgelegt sind. Das ist alles, was benötigt wird, um Spring mitzuteilen, dass wir möchten, dass unsere Anwendung sowohl JSON als auch XML unterstützt, und dass dies die Beans sind, die für die Transformation 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")
	//Das Zurückgeben einer Liste wird nur mit JSON-Antwort unterstützt
	//Wenn Sie XML möchten, fügen Sie eine Wrapper-Klasse als Root-XML-Element hinzu, zum Beispiel EmployeeList
	public List 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. Wenn unsere Methode eine Liste oder ein Array zurückgibt, unterstützt Spring nur JSON als Antwort, da das XML-Stammelement nicht anonym sein kann, JSON jedoch kann. Wenn Sie eine Rückgabe von Listen als XML unterstützen möchten, müssen Sie eine Wrapper-Klasse erstellen, um diese Liste zu halten und zurückzugeben. In einigen der Methoden erwarten wir ein Employee-Objekt als Anfrage. Spring kümmert sich um das Parsen des Anfragekörpers und die Konvertierung in das Employee-Objekt für diese Methoden. Ebenso geben wir ein Employee-Objekt als Antwortkörper zurück, auch hier kümmert sich Spring um die Konvertierung in JSON/XML-Antworten.

Accept- und Content-Type-Anforderungsheader

Wir haben unsere REST-Anwendung so konfiguriert, dass sie sowohl mit XML als auch mit JSON funktioniert. Wie soll sie jedoch 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-Anforderungsheader ins Spiel. Content-Type: Definiert den Typ des Inhalts im Anfragekörper. Wenn sein Wert „application/xml“ ist, behandelt Spring den Anfragekörper als XML-Dokument. 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 zum Testen. Ich habe sie auf Tomcat-9 bereitgestellt und teste sie mit Postman. Nachfolgend finden Sie die Testergebnisse mit Erklärungen.

Spring RestController GET JSON Response

Es handelt sich um eine einfache GET-Anfrage. Der wichtige Punkt ist der Wert des „Accept“-Headers.

Spring RestController GET XML Response

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

Spring RestController GET List

Lassen Sie uns versuchen, die API aufzurufen, um die Liste der Mitarbeiter zu erhalten. Wir erhalten eine Liste von Elementen im JSON-Format mit einem anonymen Wurzelelement. Da XML kein anonymes Wurzelelement 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

Der Spring RestController hilft uns, uns auf die Geschäftslogik zu konzentrieren, indem er sich um all die lästigen Dinge für die Erstellung von REST-Webdienst-APIs kümmert.

Sie können das komplette Projekt von unserem GitHub-Repository herunterladen.

Source:
https://www.digitalocean.com/community/tutorials/spring-restcontroller