Terminé 406 NOT_ACCEPTABLE - Test de WebLayer dans SpringBoot

Dec 07 2020

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

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

    List<WildProject> 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 - Using 'application/json', given [*/*] and supported [application/json]
20:03:38.255 [main] WARN  o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]
20:03:38.256 [main] DEBUG o.s.t.w.s.TestDispatcherServlet - Completed 406 NOT_ACCEPTABLE

MockHttpServletRequest:
      HTTP Method = GET
      Request URI = /wildProject
       Parameters = {}
          Headers = {Content-Type=[application/json;charset=UTF-8]}
             Body = null
    Session Attrs = {}

Handler:
             Type = com.bonansa.controller.AuthorisationController
           Method = public org.springframework.http.ResponseEntity<java.util.List<com.bonansa.WildProject>> com.bonansa.controller.AuthorisationController.getList() throws java.lang.Exception

Async:
    Async started = false
     Async result = null

Resolved Exception:
             Type = org.springframework.web.HttpMediaTypeNotAcceptableException

ModelAndView:
        View name = null
             View = null
            Model = null

FlashMap:
       Attributes = null

MockHttpServletResponse:
           Status = 406
    Error message = null
          Headers = {}
     Content type = null
             Body = 
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

et

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

Réponses

s7vr Dec 19 2020 at 04:59

Votre problème apparaît double.

Le problème sous-jacent que vous n'avez pas enregistré le bon convertisseur de message pour pouvoir écrire une réponse json. Ceci est caché en raison 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 produit et le client a l'en-tête d'acceptation de tous.

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 uniquement avec la version de démarrage à ressort 2.1.x.

2 x80486 Dec 08 2020 at 00:48

Vous n'avez pas besoin de définir l'en- Content-Typetête des GETdemandes puisque vous n'envoyez rien mais demandez quelque chose. L'en- Accepttête est ce que vous recherchez dans ce cas.

De plus, MediaType.APPLICATION_JSON_VALUEne 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());