[JAVA] Découvrons comment recevoir avec Request Body avec l'API REST de Spring Boot

environnement

Java8 SpringBoot 2.1.9.RELEASE

Hypothèses et partage

--Politiques pour désérialiser dans Jackson mais pas utiliser les setters de base

Exemple de code

Définition de champ de chaîne uniquement

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

/**
 *Ecrire avec Getter
 */
public class Sample {

    String id;
    String name;

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}
/**
 *Écrire dans le constructeur
 */
public class Sample {

    String id;
    String name;

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

définition de champ int uniquement

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

/**
 *Ecrire avec Getter
 */
public class Sample {

    int id;
    int age;

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }
}
/**
 *Écrire dans le constructeur
 */
public class Sample {

    int id;
    int age;

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

Au fait, si vous utilisez le type Integer, vous pouvez tolérer null (colère) {"id": null, "age": 20}

public class Sample {

    Integer id;
    int age;

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

Résultat: ʻIntSample {id = null, age = 20} `

définition de champ booléen uniquement

__Getter n'a pas pu être implémenté __ Alors seulement comment écrire dans le constructeur Envoyer JSON: {" isHoge ": true," isFuga ": true}

/**
 *Écrire dans le constructeur
 */
public class BooleanSample {

    boolean isHoge;
    boolean isFuga;

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

Pour le type booléen, ce sera null si la désérialisation n'est pas possible.

Chaîne, entier, booléen définition d'ensemble

Je l'ai vérifié comme String, int et boolean, mais il semble que le constructeur soit requis lorsque le booléen est mélangé, donc je ne peux pas envisager d'écrire avec Getter. Par conséquent, il semble que seul le constructeur puisse être défini.

Je l'ai essayé avec Getter Envoyer JSON: {" name ":" Kiguri "," age ": 24," isPerson ": true}

/**
 *Ecrire avec 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;
    }
}

Résultat: Sample {name = 'Kiguri', age = 24, isPerson = false} La valeur de boolean n'est pas liée, ce qui est un résultat très décevant ...

/**
 *Écrire dans le constructeur
 */
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;
    }
}

Résultat: SIBSample {name = 'Kiguri', age = 24, isPerson = true} Je souris.

Où je pense que c'est un piège (non résolu)

Avez-vous remarqué que l'exemple de code a jusqu'à présent préparé deux définitions de champ en commun? S'il n'y a qu'une seule définition de champ et qu'elle est désérialisée par le constructeur, elle est différente de l'utilisation d'origine, mais si vous n'utilisez pas @ JsonCreator et @ JsonProperty, vous obtiendrez une exception.

Modèle d'exception

Envoyer JSON: {" name ":" Kiguri "}

public class Sample {

    String name;

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

Contenu d'exception

{
    "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"
}

Modèle de réussite

Envoyer JSON: {" name ":" Kiguri "}

public class Sample {

    String name;

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

Résumé

C'était une explication complète de Jackson, ne pouvait-il pas s'agir d'une arnaque au titre? Aussi, dites-moi qui est familier avec la partie piège. On pourrait vous demander: "N'est-il pas correct d'ajouter @ JsonProperty au champ sans utiliser de constructeur?", Mais je vais limiter la méthode d'instanciation à un et l'ajouter à l'argument constructeur pour faciliter la visualisation. Je vais. À la recherche d'un meilleur moyen !! !!

Recommended Posts

Découvrons comment recevoir avec Request Body avec l'API REST de Spring Boot
Comment lire le corps de la requête plusieurs fois avec Spring Boot + Spring Security
[Débutant] Essayez d'écrire l'API REST pour l'application Todo avec Spring Boot
Comment utiliser CommandLineRunner dans Spring Batch of Spring Boot
Présentez swagger-ui à l'API REST implémentée dans Spring Boot
Comment démarrer par environnement avec Spring Boot de Maven
Implémenter l'API REST avec Spring Boot
Comment réaliser un téléchargement de fichiers volumineux avec Rest Template of Spring
[Spring Boot] J'ai étudié comment implémenter le post-traitement de la demande reçue.
Comment les propriétés de bean lient les paramètres de requête de style liste dans Spring
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Comment se lier avec un fichier de propriétés dans Spring Boot
Comment implémenter le verrouillage optimiste dans l'API REST
Comment définir des variables d'environnement dans le fichier de propriétés de l'application Spring Boot
Mappez automatiquement DTO aux entités avec l'API Spring Boot
Hello World (API REST) avec Apache Camel + Spring Boot 2
Comment créer un projet Spring Boot dans IntelliJ
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 2)
Personnalisez la réponse aux erreurs de l'API REST avec Spring Boot (Partie 1)
Écrivons comment créer une API avec SpringBoot + Docker à partir de 0
Comment modifier la valeur de paramètre de application.properties au moment du démarrage dans Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Faisons une API simple avec EC2 + RDS + Spring boot ①
Créez une API pour envoyer et recevoir des données Json avec Spring
Pour recevoir une demande vide avec Spring Web MVC @RequestBody
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
Comment contrôler les transactions dans Spring Boot sans utiliser @Transactional
Implémentez un serveur API Web REST simple avec Spring Boot + MySQL
[Sprint Boot] Comment utiliser les trois types de SqlParameterSource définis dans org.springframework.jdbc.core.namedparam
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot
Comment utiliser Lombok au printemps
Comment trouver May'n dans XPath
Spring avec Kotorin - 4 Conception d'API REST
Comment configurer Spring Boot + PostgreSQL
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
Je veux afficher des images avec REST Controller de Java et Spring!
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
Comment exécuter avec des commandes de langage de développement normales dans l'environnement de développement Docker
Solution de contournement pour que Command Line Runner fonctionne avec JUnit dans Spring Boot
Comment accéder directement à Socket avec la fonction TCP de Spring Integration
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
Comment savoir quelle version Java d'un fichier de classe a été compilée
Comment trouver le nombre total de pages lors de la pagination en Java
Comment insérer un traitement avec n'importe quel nombre d'éléments dans le traitement itératif dans Ruby
Convertir les paramètres de demande en Enum au printemps
Comment inclure Spring Tool dans Eclipse 4.6.3?
HTTPS avec Spring Boot et Let's Encrypt
Comment diviser un fichier de message Spring Boot
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
[Laravel] Comment gérer une erreur de mémoire insuffisante lorsque le compositeur a besoin de [Docker]
03. J'ai envoyé une demande de Spring Boot à l'API de recherche de code postal
Comment vérifier la dernière version de io.spring.platform pour l'écriture dans pom.xml de Spring (STS)
Organisez les différences de comportement de @NotBlank, @NotEmpty et @NotNull avec Spring Boot + Thymeleaf
[Spring Boot] Comment obtenir des propriétés dynamiquement à partir d'une chaîne contenue dans une URL
Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit
J'ai essayé de cloner une application Web pleine de bugs avec Spring Boot