Java >> Java Tutorial >  >> Tag >> Spring

Spring from the Trenches:Verwenden von Typkonvertern mit Spring MVC

Vor ein paar Wochen haben wir gelernt, wie wir Datums- und Zeitinformationen aus einem Anfrageparameter parsen können, indem wir das @DateTimeFormat verwenden Anmerkung.

Dies ist eine einfache und saubere Lösung, die sehr gut funktioniert, wenn wir nicht "zu viele" Controller-Methoden haben, die diesen Ansatz verwenden.

Der Nachteil dieser Lösung ist, dass wir die relevanten Methodenparameter mit dem @DateTimeFormat annotieren müssen Anmerkung und konfigurieren Sie das verwendete Datums- und Zeitformat jedes Mal, wenn wir Datums- und Zeitinformationen aus einem Anforderungsparameter analysieren möchten.

Dieser Blogbeitrag beschreibt, wie wir dieses Problem durch die Verwendung von Spring-Konvertern lösen können.

Beginnen wir mit der Erstellung der Typkonverter, die unsere Anforderungsparameter in Java 8 LocalDate konvertieren können und LocalDateTime Objekte.

Typkonverter erstellen

Wir können einen Typkonverter erstellen, indem wir Converter implementieren Schnittstelle. Wenn wir diese Schnittstelle implementieren, müssen wir zwei Typparameter bereitstellen, die im Folgenden beschrieben werden:

  • Das S type-Parameter beschreibt den Typ des Quellobjekts.
  • Das T Typ-Parameter beschreibt den Typ des Zielobjekts.

Weil wir sowohl Java 8 LocalDate unterstützen wollen und LocalDateTime Objekten haben wir zwei Typkonverter erstellt. Beginnen wir damit, einen Typkonverter zu erstellen, der String konvertiert Objekte in Java 8 LocalDate Objekte.

Konvertieren von String-Objekten in Java 8 LocalDate-Objekte

Wir können einen Typkonverter erstellen, der String konvertiert Objekte in Java 8 LocalDate Objekte, indem Sie diesen Schritten folgen:

  1. Erstellen Sie einen LocalDateConverter Klasse.
  2. Implementieren Sie den Converter Schnittstelle und setzen Sie den Quelltyp auf String und den Zieltyp auf LocalDate .
  3. Fügen Sie einen privaten DateTimeFormatter hinzu Feld zur erstellten Klasse.
  4. Fügen Sie der erstellten Klasse einen Konstruktor hinzu, der das verwendete Datumsformat als Methodenparameter übernimmt, und implementieren Sie ihn, indem Sie einen neuen DateTimeFormatter erstellen Objekt.
  5. Überschreiben Sie convert() Methode, indem Sie diese Regeln befolgen:
    • Wenn die Quellzeichenfolge null oder leer ist, null zurückgeben.
    • Wenn die Quellzeichenfolge nicht null oder leer ist, geben Sie ein neues LocalDate zurück Objekt.

Der Quellcode des LocalDateConverter Klasse sieht wie folgt aus:

import org.springframework.core.convert.converter.Converter;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public final class LocalDateConverter implements Converter<String, LocalDate> {

    private final DateTimeFormatter formatter;

    public LocalDateConverter(String dateFormat) {
        this.formatter = DateTimeFormatter.ofPattern(dateFormat);
    }

    @Override
    public LocalDate convert(String source) {
        if (source == null || source.isEmpty()) {
            return null;
        }

        return LocalDate.parse(source, formatter);
    }
}

Lassen Sie uns herausfinden, wie wir einen Typkonverter erstellen können, der String konvertiert Objekte in Java 8 LocalDateTime Objekte.

Konvertieren von String-Objekten in Java 8 LocalDateTime-Objekte

Wir können einen Typkonverter erstellen, der String konvertiert Objekte in Java 8 LocalDateTime Objekte, indem Sie diesen Schritten folgen:

  1. Erstellen Sie einen LocalDateTimeConverter Klasse.
  2. Implementieren Sie den Converter Schnittstelle und setzen Sie den Quelltyp auf String und den Zieltyp auf LocalDateTime .
  3. Fügen Sie einen privaten DateTimeFormatter hinzu Feld zur erstellten Klasse.
  4. Fügen Sie der erstellten Klasse einen Konstruktor hinzu, der das verwendete Datums- und Uhrzeitformat als Methodenparameter übernimmt, und implementieren Sie ihn, indem Sie einen neuen DateTimeFormatter erstellen Objekt.
  5. Überschreiben Sie convert() Methode, indem Sie diese Regeln befolgen:
    • Wenn die Quellzeichenfolge null oder leer ist, null zurückgeben.
    • Wenn die Quellzeichenfolge nicht null oder leer ist, geben Sie eine neue LocalDateTime zurück Objekt.

Der Quellcode des LocalDateTimeConverter Klasse sieht wie folgt aus:

import org.springframework.core.convert.converter.Converter;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public final class LocalDateTimeConverter implements Converter<String, LocalDateTime> {

    private final DateTimeFormatter formatter;

    public LocalDateTimeConverter(String dateFormat) {
        this.formatter = DateTimeFormatter.ofPattern(dateFormat);
    }

    @Override
    public LocalDateTime convert(String source) {
        if (source == null || source.isEmpty()) {
            return null;
        }

        return LocalDateTime.parse(source, formatter);
    }
}

Bevor wir unsere neuen Typkonverter verwenden können, müssen wir den Anwendungskontext unserer Webanwendung konfigurieren.

Konfigurieren des Anwendungskontextes unserer Webanwendung

Bevor wir unsere Typkonverter verwenden können, müssen wir sie der Spring Formatter-Registrierung hinzufügen. In diesem Abschnitt wird beschrieben, wie wir den Anwendungskontext unserer Webanwendung konfigurieren können, die entweder Spring oder Spring Boot verwendet.

Konfigurieren einer Spring-Webanwendung

Wenn wir unsere Typkonverter in die Formatiererregistrierung einer Spring-Webanwendung hinzufügen möchten, müssen wir die folgenden Änderungen an der Konfigurationsklasse vornehmen, die die Webschicht unserer Spring-Webanwendung konfiguriert:

  1. Erweitern Sie den WebMvcConfigurerAdapter Klasse.
  2. Überschreiben Sie die addFormatters(FormatterRegistry-Registry) -Methode des WebMvcConfigurerAdapter Klasse.
  3. Implementieren Sie diese Methode, indem Sie unsere Typkonverter in die Spring-Formatter-Registrierung einfügen.

Der Quellcode von WebMvcContext Klasse sieht wie folgt aus:

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
class WebMvcContext extends WebMvcConfigurerAdapter {

	@Override
	public void addFormatters(FormatterRegistry registry) {
		registry.addConverter(new LocalDateConverter("yyyy-MM-dd"));
		registry.addConverter(new LocalDateTimeConverter("yyyy-MM-dd'T'HH:mm:ss.SSS"));
	}
}

Lassen Sie uns weitermachen und herausfinden, wie wir unsere Typkonverter in die Formatiererregistrierung einer Spring Boot-Webanwendung einfügen können.

Konfigurieren einer Spring Boot-Webanwendung

Wenn wir unsere Typkonverter in die Formatiererregistrierung einer Spring Boot-Webanwendung hinzufügen möchten, müssen wir die folgenden Änderungen an der "Anwendungsklasse" unserer Spring Boot-Webanwendung vornehmen:

  1. Erweitern Sie den WebMvcConfigurerAdapter Klasse.
  2. Überschreiben Sie die addFormatters(FormatterRegistry-Registry) -Methode des WebMvcConfigurerAdapter Klasse.
  3. Implementieren Sie diese Methode, indem Sie unsere Typkonverter in die Spring-Formatter-Registrierung einfügen.

Der Quellcode der SpringBootExampleApplication Klasse sieht wie folgt aus:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class SpringBootExampleApplication extends WebMvcConfigurerAdapter {

    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new LocalDateConverter("yyyy-MM-dd"));
        registry.addConverter(new LocalDateTimeConverter("yyyy-MM-dd'T'HH:mm:ss.SSS"));
    }

    public static void main(String[] args) {
        SpringApplication.run(SpringBootExampleApplication.class, args);
    }
}

Wir sind fertig. Lassen Sie uns herausfinden, wie wir unsere Typkonverter verwenden können.

Verwenden der Typkonverter

Nachdem wir den Anwendungskontext unserer Webanwendung konfiguriert haben, können wir unsere Typkonverter verwenden, indem Sie diesen Schritten folgen:

  1. Fügen Sie unserer Controller-Methode einen neuen Methodenparameter hinzu und setzen Sie den Typ dieses Methodenparameters auf LocalDate oder LocalDateTime .
  2. Konfigurieren Sie den Namen des Anforderungsparameters, indem Sie den Methodenparameter mit @RequestParam kommentieren Anmerkung.

Der Quellcode unserer Controller-Klasse sieht wie folgt aus:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
 
import java.time.LocalDate;
import java.time.LocalDateTime;
 
@RestController
@RequestMapping("/api/datetime/")
final class DateTimeController {
 
    @RequestMapping(value = "date", method = RequestMethod.POST)
    public void processDate(@RequestParam("date") LocalDate date) {
        //Do stuff
    }
 
    @RequestMapping(value = "datetime", method = RequestMethod.POST)
    public void processDateTime(@RequestParam("datetime") LocalDateTime dateAndTime) {
        //Do stuff
    }
}

Fahren wir fort und fassen zusammen, was wir aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogpost hat uns zwei Dinge gelehrt:

  • Wir können einen neuen Typkonverter erstellen, indem wir Converter implementieren Schnittstelle.
  • Bevor wir unseren Typkonverter verwenden können, müssen wir ihn zur Spring-Formatter-Registrierung hinzufügen. Wir können dies tun, indem wir den WebMvcConfigurerAdapter erweitern -Klasse und überschreibt ihre addFormatters(FormatterRegistry-Registrierung) Methode.

P.S. Sie können die Beispielanwendung dieses Blogbeitrags von Github erhalten.


Java-Tag