5 votes

Terminé 406 NOT_ACCEPTABLE - Test de WebLayer dans SpringBoot

J'ai cette méthode dans une application Spring Boot v2.1.0.RELEASE.

@GetMapping(value = "/wildProject", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity> getList(HttpServletRequest request,
        HttpServletResponse response)
        throws Exception {

    List list = authorisationService.getList();

    System.out.println("-----------------");
    System.out.println(list);
    System.out.println("-----------------");

    return ok().body(list);

} 

et ce test:

 this.mockMvc.perform(get("/wildProject")
  //.accept(MediaType.APPLICATION_JSON_UTF8_VALUE))
  // .andDo(print())
  .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
  .andExpect(status().isOk());

et voici le résultat du test:

20:03:38.253 [main] DEBUG o.s.w.s.m.m.a.HttpEntityMethodProcessor - Utilisation de 'application/json', donné [*/*] et pris en charge [application/json]
20:03:38.255 [main] WARN  o.s.w.s.m.s.DefaultHandlerExceptionResolver - Résolu [org.springframework.web.HttpMediaTypeNotAcceptableException: Impossible de trouver une représentation acceptable]
20:03:38.256 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Terminé 406 NON_ACCEPTABLE

MockHttpServletRequest:
      Méthode HTTP = GET
      URI de la requête = /wildProject
       Paramètres = {}
          En-têtes = {Content-Type=[application/json;charset=UTF-8]}
             Corps = null
    Attributs de session = {}

Gestionnaire:
             Type = com.bonansa.controller.AuthorisationController
           Méthode = public org.springframework.http.ResponseEntity> com.bonansa.controller.AuthorisationController.getList() throws java.lang.Exception

Asynchrone:
    Démarré de manière asynchrone = false
     Résultat asynchrone = null

Exception résolue:
             Type = org.springframework.web.HttpMediaTypeNotAcceptableException

ModelAndView:
        Nom de la vue = null
             Vue = null
            Modèle = null

FlashMap:
       Attributs = null

MockHttpServletResponse:
           Statut = 406
    Message d'erreur = null
          En-têtes = {}
     Type de contenu = null
             Corps = 
    URL transférée = null
   URL redirigée = null
          Cookies = []

et

@JsonSerialize(as = IWildProject.class)
public interface IWildProject {
..
}

2voto

x80486 Points 2879

Vous n'avez pas besoin de définir l'en-tête Content-Type pour les requêtes GET car vous n'envoyez rien mais demandez quelque chose. L'en-tête Accept est ce que vous recherchez dans ce cas.

De plus, MediaType.APPLICATION_JSON_VALUE ne correspondra pas à MediaType.APPLICATION_JSON_UTF8_VALUE.

Je recommanderais de refactoriser ce morceau de code en :

this.mockMvc.perform(get("/wildProject")
  .accept(MediaType.APPLICATION_JSON_VALUE))
  // .andDo(print())
  .andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
  .andExpect(status().isOk());

0voto

Veeram Points 36230

Votre problème semble double.

Le problème sous-jacent est que vous n'avez pas enregistré le bon convertisseur de messages pour pouvoir écrire une réponse json. Cela est caché à cause du bogue où le serveur devrait renvoyer 500 au lieu de 406 pour une mauvaise configuration car le contrôleur a spécifié l'annotation Produces et le client a un en-tête de toutes les acceptations.

Plus de détails - https://github.com/spring-projects/spring-framework/issues/23287

Ce n'est plus un problème dans la dernière version, seul un problème avec la version 2.1.x de spring boot.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X