Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Boot Java Discussion :

@RequestBody et l'utf8


Sujet :

Spring Boot Java

  1. #1
    Membre confirmé
    @RequestBody et l'utf8
    Bonjour,
    j'ai une erreur avec @requestbody, quand je consomme mon api j'ai cette erreur :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    2020-04-29 18:36:05.335  WARN 9116 --- [nio-8181-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported]


    Il y a quelque jours javais réussi à ne pas avoir cette erreur mais à force de modifier mon code et de m'occuper d'autre partie du code , je me retrouve avec ce message.
    Ce message je l'ai lorsque je fait la requête avec ARC REST.

    voici le @restcontroller:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      @PostMapping("/newAuth")
      public ResponseEntity<Test> newAuth(@RequestBody Test newAuth) throws Exception {
        if (AuthServiceIntf.trouvemail(newAuth.getmail()) == null) {
          AuthServiceIntf.saveAuth(newAuth);
     
          return new ResponseEntity<Test>(newAuth, HttpStatus.OK);
        }
     
        return new ResponseEntity<Test>(newAuth, HttpStatus.CONFLICT);
      }


    Lorsque j'utilise Angular pour consommer cette requête j'ai une erreur 403 forbidden.
    Quant je change mon entité class "Test" par String, je n'ai plus cette erreur.
    Quelle est le problème ? c'est la réception de la requête qui est encodé en UTF8 et que spring n'arrive pas à le déchiffrer ?
    Mon entité <TEST> est encodé en UTF8 ?.

    j'ai un autre controller:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      @PostMapping("/authWbs")
      public ResponseEntity<Panier> payer(@RequestBody Panier keyConsentement) throws Exception {
        System.out.println(keyConsentement + "===========");
        return new ResponseEntity<Panier>(keyConsentement, HttpStatus.OK);
     
      }


    voici mon entité:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
     
    @Entity
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public class Panier implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String amount;
     
        /*
        private Integer qte;
     
        private String produit;*/
     
    }


    Quant je consomme le service avec ARC REST, j'ai n'ai pas cette erreur d'utf8 (avec le même type application/json)??

    voici à quoi ressemble mon entite

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    import java.io.Serializable;
    import java.util.Collection;
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
     
    import lombok.ToString;
    services.UtileIntf;
     
    @Entity @ToString
    public class Test implements Serializable {
        @Id
        @GeneratedValue
        private Long id;
        @Column(unique=true)
        private String courriel;
        private String password;
        @OneToMany(mappedBy = "Test")
        private Collection<Inscrit> Tests;
     
        public Long getId() {
            return this.id;
        }
     
        public void setId(Long id) {
            this.id = id;
        }
     
        public String getcourriel() {
            return this.courriel;
        }
     
        public void setcourriel(String courriel) {
            this.courriel = courriel;
        }
     
        public String getpassword() {
            return this.password;
        }
     
        public void setpassword(String password) {
            this.password = password;
        }
     
        public String getValidKey() {
            return this.validKey;
        }
     
        public void setValidKey(String validKey) {
            this.validKey = validKey;
        }
     
        public Collection<Inscrit> getTests() {
            return this.Tests;
        }
     
        public void setTests(Collection<Inscrit> Tests) {
            this.Tests = Tests;
        }
     
     
        public Test() {
            super();
        }
     
        public Test(String courriel, String password) {
            super();
            this.courriel = courriel;
            this.password =  UtileIntf.encodepassword(password);
        }


    Je ne comprend pas pourquoi en utilisant panier je n'ai pas d'erreur de @RequestBody , pour être encore plus sur j' 'ai remplacé mon entité <TEST> par le panier et je n'a plus d'erreur d'UTF8.

    Pour les controller doit-je tous récupérer les éléments sous forme de string , et "d'hydrater" mes entité avec des set pour éviter l'erreur UTF8

    Si vous avez une idée ? merci de vos réponses.

  2. #2
    Membre confirmé
    J'ai fait un test simple, et je me retrouve avec cette erreur à cause de l'annotation @onToMany

    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    import java.io.Serializable;
     
    import javax.persistence.OneToMany;
     
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;
    import ohkod.sklt.entities.BookodRole;
     
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class Bouchon implements Serializable {
        private String myName;
        private String myRx;
        private String myTx;
    //produit l'erreur UTF8
        @OneToMany
        private Role roles;
     
    }


    voici le controller rest:

    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        @PostMapping("/bouchonPost")
        public ResponseEntity<Bouchon> RxTx(@RequestBody Bouchon Rx) throws Exception {
            System.out.println(Rx + "===========");
            return new ResponseEntity<Bouchon>(Rx, HttpStatus.OK);
     
          }


    Je pense qu'il n'est pas possible d'exploiter directement une class entité
    Quelle serais la solution la plus adapté pour hydrater les attributs des classes ?

    faire class qui étant de Bouchon et à la place de mettre des relations , mettre uniquement des listes ou collections et changer le type?

    Code java :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
        public ResponseEntity<BouchonSansRelation> RxTx(@RequestBody BouchonSansRelation Rx) throws Exception {

    réceptionner toutes les en chaînes de caractères sous forme de string, et les transformer en json puis hydrater mes attributs ?
    [CODE="java] public ResponseEntity RxTx(@RequestBody String Rx) throws Exception { Json rx = decodeJson(Rx) Bouchon = bouchon; bouchon.myName(Rx.myName); [/CODE]