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<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
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.
Vous n'avez pas besoin de définir l'en- Content-Type
tête des GET
demandes puisque vous n'envoyez rien mais demandez quelque chose. L'en- Accept
tête 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());