Dans Spring MVC, comment puis-je définir l’en-tête de type MIME lors de l’utilisation de @ResponseBody?

J’ai un contrôleur Spring MVC qui renvoie une chaîne JSON et je souhaite définir le type MIME sur application / json. Comment puis je faire ça?

@RequestMapping(method=RequestMethod.GET, value="foo/bar") @ResponseBody public Ssortingng fooBar(){ return myService.getJson(); } 

Les objects métier étant déjà disponibles sous forme de chaînes JSON, l’utilisation de MappingJacksonJsonView n’est pas la solution pour moi. @ResponseBody est parfait, mais comment puis-je définir le type MIME?

Je considérerais de refactoriser le service pour renvoyer votre object de domaine plutôt que les chaînes JSON et laisser Spring gérer la sérialisation (via le MappingJacksonHttpMessageConverter en écriture). Depuis le spring 3.1, l’implémentation a l’air très soignée:

 @RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET value = "/foo/bar") @ResponseBody public Bar fooBar(){ return myService.getBar(); } 

Commentaires:

Tout d’abord, le ou le @EnableWebMvc doit être ajouté à la configuration de votre application.

Ensuite, l’atsortingbut @RequestMapping annotation @RequestMapping est utilisé pour spécifier le type de contenu de la réponse. Par conséquent, il doit être défini sur MediaType.APPLICATION_JSON_VALUE (ou "application/json" ).

Enfin, Jackson doit être ajouté de sorte que toute sérialisation et désérialisation entre Java et JSON soit gérée automatiquement par Spring (la dépendance de Jackson est détectée par Spring et MappingJacksonHttpMessageConverter sera sous le capot).

Utilisez ResponseEntity au lieu de ResponseBody . De cette façon, vous avez access aux en-têtes de réponse et vous pouvez définir le type de contenu approprié. Selon les documents de spring :

HttpEntity est similaire à @RequestBody et @ResponseBody . En plus d’avoir access au corps de la requête et de la réponse, HttpEntity (et la sous-classe ResponseEntity spécifique à la ResponseEntity ) permet également d’accéder aux en-têtes de demande et de réponse.

Le code ressemblera à:

 @RequestMapping(method=RequestMethod.GET, value="/fooBar") public ResponseEntity fooBar2() { Ssortingng json = "jsonResponse"; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.APPLICATION_JSON); return new ResponseEntity(json, responseHeaders, HttpStatus.CREATED); } 

Vous ne pourrez peut-être pas le faire avec @ResponseBody, mais cela devrait fonctionner:

 package xxx; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class FooBar { @RequestMapping(value="foo/bar", method = RequestMethod.GET) public void fooBar(HttpServletResponse response) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); out.write(myService.getJson().getBytes()); response.setContentType("application/json"); response.setContentLength(out.size()); response.getOutputStream().write(out.toByteArray()); response.getOutputStream().flush(); } } 

Je ne pense pas que ce soit possible. Il semble y avoir une Jira ouverte pour cela:

SPR-6702: Définir explicitement la réponse Content-Type dans @ResponseBody

Enregistrez org.springframework.http.converter.json.MappingJacksonHttpMessageConverter comme convertisseur de message et renvoyez l’object directement à partir de la méthode.

           

et le contrôleur:

 @RequestMapping(method=RequestMethod.GET, value="foo/bar") public @ResponseBody Object fooBar(){ return myService.getActualObject(); } 

Cela nécessite la dépendance org.springframework:spring-webmvc .

Je ne pense pas que vous pouvez, à part response.setContentType(..)

Ma version de la réalité. Chargement d’un fichier HTML et diffusion en continu dans le navigateur.

 @Controller @RequestMapping("/") public class UIController { @RequestMapping(value="index", method=RequestMethod.GET, produces = "text/html") public @ResponseBody Ssortingng GetBootupFile() throws IOException { Resource resource = new ClassPathResource("MainPage.html"); Ssortingng fileContents = FileUtils.readFileToSsortingng(resource.getFile()); return fileContents; } }