[JAVA] Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können

Umgebung

Java8 SpringBoot 2.1.9.RELEASE

Annahmen und Teilen

Beispielcode

Nur String-Felddefinition

JSON senden: {" id ":" 1 "," name ":" Name "}

/**
 *Schreiben Sie mit Getter
 */
public class Sample {

    String id;
    String name;

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
/**
 *Schreiben Sie in den Konstruktor
 */
public class Sample {

    String id;
    String name;

    public Sample(String id, String name) {
        this.id = id;
        this.name = name;
    }
}

Nur int-Felddefinition

JSON senden: {" id ": 1," age ": 20}

/**
 *Schreiben Sie mit Getter
 */
public class Sample {

    int id;
    int age;

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }
}
/**
 *Schreiben Sie in den Konstruktor
 */
public class Sample {

    int id;
    int age;

    public Sample(int id, int age) {
        this.id = id;
        this.age = age;
    }
}

Übrigens, wenn Sie den Integer-Typ verwenden, können Sie null (Wut) tolerieren. {"id": null, "age": 20}

public class Sample {

    Integer id;
    int age;

    public Sample(Integer id, int age) {
        this.id = id;
        this.age = age;
    }
}

Ergebnis: IntSample {id = null, age = 20}

Nur boolesche Felddefinition

__Getter konnte nicht implementiert werden __ Also nur wie man im Konstruktor schreibt JSON senden: {" isHoge ": true," isFuga ": true}

/**
 *Schreiben Sie in den Konstruktor
 */
public class BooleanSample {

    boolean isHoge;
    boolean isFuga;

    public BooleanSample(boolean isHoge, boolean isFuga) {
        this.isHoge = isHoge;
        this.isFuga = isFuga;
    }
}

Für den Booleschen Typ ist es "null", wenn keine Deserialisierung möglich ist.

String, int, boolean alle Set Definition

Ich habe es als String, int und boolean überprüft, aber es scheint, dass der Konstruktor erforderlich ist, wenn der boolean gemischt wird, so dass ich nicht überlegen kann, wie ich es mit Getter schreiben soll. Daher scheint es, dass nur der Konstruktor definiert werden kann.

Ich habe es mit Getter versucht JSON senden: {" name ":" Kiguri "," age ": 24," isPerson ": true}

/**
 *Schreiben Sie mit Getter
 */
public class Sample {

    String name;
    int age;
    boolean isPerson;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public boolean isPerson() {
        return isPerson;
    }
}

Ergebnis: Sample {name = 'Kiguri', age = 24, isPerson = false} Der Wert von Boolean ist nicht gebunden, was ein sehr enttäuschendes Ergebnis ist ...

/**
 *Schreiben Sie in den Konstruktor
 */
public class Sample {

    String name;
    int age;
    boolean isPerson;

    public Sample(String name, int age, boolean isPerson) {
        this.name = name;
        this.age = age;
        this.isPerson = isPerson;
    }
}

Ergebnis: SIBSample {name = 'Kiguri', age = 24, isPerson = true} Ich lächle.

Wo ich denke, es ist eine Falle (ungelöst)

Haben Sie bemerkt, dass der Beispielcode bisher zwei gemeinsame Felddefinitionen erstellt hat? Wenn es nur eine Felddefinition gibt und diese vom Konstruktor deserialisiert wird, unterscheidet sie sich von der ursprünglichen Verwendung. Wenn Sie jedoch nicht "@ JsonCreator" und "@ JsonProperty" verwenden, wird eine Ausnahme angezeigt.

Ausnahmemuster

JSON senden: {" name ":" Kiguri "}

public class Sample {

    String name;

    public Sample(String name) {
        this.name = name;
    }
}

Ausnahmeinhalt

{
    "timestamp": "2019-10-11T03:25:50.724+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "JSON parse error: Cannot construct instance of `sandbox.Sample` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `sandbox.Sample` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 1, column: 2]",
    "path": "/s"
}

Erfolgsmuster

JSON senden: {" name ":" Kiguri "}

public class Sample {

    String name;

    @JsonCreator
    public Sample(@JsonProperty("name") String name) {
        this.name = name;
    }
}

Zusammenfassung

Ich frage mich, ob es ein Titelbetrug sein wird, der Jackson vollständig erklärt hat. Bitte sagen Sie mir auch, wer mit dem Fallenteil vertraut ist. Möglicherweise werden Sie gefragt: "Ist es nicht in Ordnung, dem Feld" @ JsonProperty "hinzuzufügen, ohne einen Konstruktor zu verwenden?" Ich werde. Auf der Suche nach einem besseren Weg !! !!

Recommended Posts

Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können
So lesen Sie Request Body mit Spring Boot + Spring Security mehrmals
[Anfänger] Versuchen Sie, die REST-API für die Todo-App mit Spring Boot zu schreiben
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Führen Sie swagger-ui in die in Spring Boot implementierte REST-API ein
Booten nach Umgebung mit Spring Boot of Maven
Implementieren Sie die REST-API mit Spring Boot
So erzielen Sie mit Rest Template of Spring einen großen Datei-Upload
[Spring Boot] Ich habe untersucht, wie die Nachbearbeitung der empfangenen Anforderung implementiert werden kann.
Wie Bean-Eigenschaften Anforderungsparameter im Listenstil in Spring binden
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So binden Sie mit einer Eigenschaftendatei in Spring Boot
So implementieren Sie optimistisches Sperren in der REST-API
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
Hallo Welt (REST API) mit Apache Camel + Spring Boot 2
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Lassen Sie uns schreiben, wie API mit SpringBoot + Docker von 0 erstellt wird
So ändern Sie den Einstellungswert von application.properties beim Booten im Frühjahrsstart
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
Erstellen wir eine einfache API mit EC2 + RDS + Spring Boot ①
Erstellen Sie eine API zum Senden und Empfangen von Json-Daten mit Spring
So erhalten Sie eine leere Anfrage mit Spring Web MVC @RequestBody
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
So steuern Sie Transaktionen in Spring Boot ohne Verwendung von @Transactional
Implementieren Sie einen einfachen Web-REST-API-Server mit Spring Boot + MySQL
[Sprint Boot] Verwendung der drei in org.springframework.jdbc.core.namedparam definierten Arten von SqlParameterSource
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
Wie man Lombok im Frühling benutzt
So finden Sie May'n in XPath
Feder mit Kotorin --4 REST API Design
So stellen Sie Spring Boot + PostgreSQL ein
So wenden Sie Thymeleaf-Änderungen sofort mit #Spring Boot + maven auf den Browser an
Ich möchte Bilder mit REST Controller von Java und Spring anzeigen!
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
Ausführen mit normalen Befehlen für die Entwicklungssprache in der Docker-Entwicklungsumgebung
Problemumgehung für Command Line Runner zur Arbeit mit JUnit in Spring Boot
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu
So konvertieren Sie ein Array von Strings mit der Stream-API in ein Array von Objekten
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So fügen Sie die Verarbeitung mit einer beliebigen Anzahl von Elementen in die iterative Verarbeitung in Ruby ein
Konvertieren Sie Anforderungsparameter im Frühjahr in Enum
Wie kann ich Spring Tool in Eclipse 4.6.3 einbinden?
HTTPS mit Spring Boot und Let's Encrypt
So teilen Sie eine Spring Boot-Nachrichtendatei
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
[Laravel] Umgang mit Fehlern aufgrund von Speichermangel, wenn Komponisten [Docker] benötigen
03. Ich habe eine Anfrage von Spring Boot an die Postleitzahlensuch-API gesendet
So überprüfen Sie die neueste Version von io.spring.platform für das Schreiben in pom.xml von Spring (STS)
Organisieren Sie die Unterschiede im Verhalten von @NotBlank, @NotEmpty und @NotNull mit Spring Boot + Thymeleaf
[Spring Boot] So rufen Sie Eigenschaften dynamisch aus einer in einer URL enthaltenen Zeichenfolge ab
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen