IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 Web Java Discussion :

Encoding: Changement des caractères entre le controller et ce qui est dans le JSON


Sujet :

Spring Web Java

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 451
    Points : 881
    Points
    881
    Billets dans le blog
    5
    Par défaut Encoding: Changement des caractères entre le controller et ce qui est dans le JSON
    Bonjour,

    J'ai un problème qui me fait tourner en bourrique, sur lequel j'ai essayé pleins de chose et à chaque fois, c'est l'échec critique.

    Je pense que la question a été posée à de maintes reprises, mais là, ça fait 1,5 jours que je suis sur ce problème.
    Je cherche une solution simple et viable.

    J'ai un projet Spring Boot (en l'occurence celui-ci: https://www.developpez.net/forums/d2...spring-2023-a/ ).
    Il a un client en Vue JS.

    Je package le tout dans un war car je suis contraint par un existant.

    J'ai un problème d'encoding.

    J'ai une DTO:
    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
     
    package fr.cisirh.explorateur.dto;
     
    public class DomaineDTO {
     
    	private Long id;
     
    	private String label;
     
    	public Long getId() {
    		return id;
    	}
     
    	public void setId(Long id) {
    		this.id = id;
    	}
     
    	public String getLabel() {
    		return label;
    	}
     
    	public void setLabel(String label) {
    		this.label = label;
    	}
     
    	@Override
    	public String toString() {
    		return "DomaineDTO [id=" + id + ", label=" + label + "]";
    	}
     
     
    }
    Cette DTO est listé grâce au service REST suivant:
    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
     
    package fr.cisirh.explorateur.controller;
     
    import java.util.List;
    import java.util.stream.Collectors;
     
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
     
    import fr.cisirh.explorateur.anotations.InjectUser;
    import fr.cisirh.explorateur.dto.DomaineDTO;
    import fr.cisirh.explorateur.dto.UserDTO;
    import fr.cisirh.explorateur.service.DomaineService;
     
    @RestController
    @RequestMapping("/domaine")
    public class DomaineController {
     
    	private static final Logger LOG = LoggerFactory.getLogger(DomaineController.class);
     
    	private final DomaineService domaineService;
     
    	public DomaineController(DomaineService domaineService) {
    		this.domaineService = domaineService;
    	}
     
    	@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    	public ResponseEntity<List<DomaineDTO>> getDomaines(@InjectUser UserDTO user){
    		if(user == null) {
    			return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    		}
    		List<DomaineDTO> toto = domaineService.getDomainesByRoles(user.getRoles().stream().map(r -> r.getRolMod()).collect(Collectors.toList()));
    		LOG.info("MIAOU = "+toto.toString());
    		return ResponseEntity.ok(domaineService.getDomainesByRoles(user.getRoles().stream().map(r -> r.getRolMod()).collect(Collectors.toList())));
    	}
    }
    Mon problème est en "pré-prod" (le contexte où je travail est un peu particulier).

    Une des ligne dans la base de données (ici Oracle) a un "é".

    Côté log dans le service REST:
    Nom : pb_encodage_2023_03_31.png
Affichages : 138
Taille : 24,0 Ko

    Mais dans le dialog, j'ai un affichage détestatble.
    Nom : pb_encodage_2023_03_31_2.png
Affichages : 130
Taille : 5,7 Ko

    En accord avec le JSON envoyé.
    Nom : pb_encodage_2023_03_31_3.png
Affichages : 133
Taille : 7,8 Ko
    Cordialement.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 306
    Points : 9 516
    Points
    9 516
    Billets dans le blog
    1
    Par défaut
    A la louche, vu ce que tu montres, je dirais que les caractères renvoyés sont UTF-8 et que ton client ne récupère pas les données en UTF-8 mais plutôt quelque chose comme de l'ISO-8859-1 ou Windows-1252 (si c'est sur Windows).

    Le fait que la log côté serveur affiche correctement veut juste dire que de ce côté, il y a adéquation entre les caractères et le paramétrage de la sortie.

    Je n'utilise pas Spring et je débute sur Vue.js mais de ce que j'ai pu voir sur le net, côté Spring il y a moyen de préciser l'encodage pour la réponse en ajoutant le header qui va bien.
    Un truc dans ce genre (A tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ResponseEntity<String> customHeader() {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(new MediaType("applicaton", "json", StandardCharsets.UTF_8));
     
        return new ResponseEntity<>(
          "Custom header set", headers, HttpStatus.OK);
    }
    Dans Vue.js, j'ai trouvé ceci, je ne sais pas si c'est bon mais tu peux tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     metaInfo() {
            return {
                title: 'My',
                titleTemplate: '%s | Titulo',
                meta: [
                    { charset: 'utf-8' },
                    { equiv: 'Content-Type', content: 'text/html' },
                    { name: 'viewport', content: 'width=device-width, initial-scale=1' }                 
     
                ]
            }
        },
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 451
    Points : 881
    Points
    881
    Billets dans le blog
    5
    Par défaut
    Le test ne fonctionne pas.

    Les TU sur le rest service ne passent pas (je passe de 200 à 500) et déployé sur un serveur Tomcat via eclipse, à l'aide d'un navigateur, ça ne répond même plus.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 451
    Points : 881
    Points
    881
    Billets dans le blog
    5
    Par défaut
    Je n'ai testé que la partie Java.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/09/2020, 10h01
  2. Réponses: 4
    Dernier message: 20/12/2018, 17h28
  3. Réponses: 11
    Dernier message: 10/01/2010, 23h22
  4. changement des données entre les UI
    Par assouma01 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 30/03/2009, 13h06
  5. Changement Des données entre deux bases
    Par Chakib dans le forum Access
    Réponses: 4
    Dernier message: 28/01/2006, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo