Spring MVC – Comment retourner une chaîne simple en tant que JSON dans Rest Controller

Ma question est essentiellement une suite à cette question.

@RestController public class TestController { @RequestMapping("/getSsortingng") public Ssortingng getSsortingng() { return "Hello World"; } } 

Dans ce qui précède, Spring ajoute “Hello World” dans le corps de la réponse. Comment puis-je retourner une chaîne en tant que réponse JSON? Je comprends que je pourrais append des citations, mais cela ressemble plus à un hack.

Veuillez fournir des exemples pour aider à expliquer ce concept.

Remarque: Je ne veux pas que cela soit écrit directement dans le corps de la réponse HTTP, je souhaite renvoyer la chaîne au format JSON (j’utilise mon Controller avec RestyGWT qui nécessite que la réponse soit au format JSON valide).

Soit retourne text/plain (comme dans Return ssortingng ssortingng message de Spring MVC 3 Controller ) OU encapsule votre Ssortingng est un object

 public class SsortingngResponse { private Ssortingng response; public SsortingngResponse(Ssortingng s) { this.response = s; } // get/set omitted... } 

Définissez votre type de réponse sur application/json

 @RequestMapping(value = "/getSsortingng", method = RequestMethod.GET, produces = "application/json") 

et vous aurez un JSON qui ressemble à

 { "response" : "your ssortingng value" } 

JSON est essentiellement une chaîne dans un contexte PHP ou JAVA. Cela signifie que la chaîne JSON valide peut être retournée en réponse. La suite devrait fonctionner.

  @RequestMapping(value="/user/addUser", method=RequestMethod.POST) @ResponseBody public Ssortingng addUser(@ModelAtsortingbute("user") User user) { if (user != null) { logger.info("Inside addIssuer, adding: " + user.toSsortingng()); } else { logger.info("Inside addIssuer..."); } users.put(user.getUsername(), user); return "{\"success\":1}"; } 

Ceci est correct pour une réponse de chaîne simple. Mais pour une réponse JSON complexe, vous devez utiliser la classe wrapper décrite par Shaun.

Depuis que j’ai posté cette question, j’ai commencé à utiliser JSONObject ( informations de dépendance Maven ). Surtout en travaillant avec une équipe, je trouve plus facile de s’attendre à ce qu’une chaîne soit renvoyée plutôt qu’un object wrapper alors que tout ce que je veux, c’est une chaîne simple.

Exemple d’utilisation:

 @RestController public class TestController { @RequestMapping("/getSsortingng") public Ssortingng getSsortingng() { return JSONObject.quote("Hello World"); } } 

Vous pouvez facilement renvoyer JSON avec Ssortingng dans la response propriété comme suit

 @RestController public class TestController { @RequestMapping((value = "/getSsortingng", produces = MediaType.APPLICATION_JSON_VALUE) public Map getSsortingng() { return Collections.singletonMap("response", "Hello World"); } } 

Il suffit de désenregistrer l’instance SsortingngHttpMessageConverter par défaut:

 @Configuration public class WebMvcConfiguration extends WebMvcConfigurationSupport { /** * Unregister the default {@link SsortingngHttpMessageConverter} as we want Ssortingngs * to be handled by the JSON converter. * * @param converters List of already configured converters * @see WebMvcConfigurationSupport#addDefaultHttpMessageConverters(List) */ @Override protected void extendMessageConverters(List> converters) { converters.stream() .filter(c -> c instanceof SsortingngHttpMessageConverter) .findFirst().ifPresent(converters::remove); } } 

Testé avec les méthodes de gestionnaire d’action de contrôleur et les gestionnaires d’exception de contrôleur:

 @RequestMapping("/foo") public Ssortingng produceFoo() { return "foo"; } @ExceptionHandler(FooApiException.class) public Ssortingng fooException(HttpServletRequest request, Throwable e) { return e.getMessage(); } 

Notes finales:

  • extendMessageConverters est disponible depuis le spring 4.1.3, s’il est exécuté sur une version précédente, vous pouvez implémenter la même technique en utilisant configureMessageConverters , cela extendMessageConverters juste un peu plus de travail.
  • C’était une approche de nombreuses autres approches possibles, si votre application ne renvoie que JSON et aucun autre type de contenu, il vaut mieux ignorer les convertisseurs par défaut et append un seul convertisseur jackson. Une autre approche consiste à append les convertisseurs par défaut mais dans un ordre différent afin que le convertisseur jackson soit antérieur à celui de la chaîne. Cela devrait permettre aux méthodes d’action du contrôleur de dicter comment elles veulent que Ssortingng soit convertie en fonction du type de média de la réponse.

Ajouter des produces = "application/json" dans l’annotation @RequestMapping comme:

 @RequestMapping(value = "api/login", method = RequestMethod.GET, produces = "application/json") 

Astuce: En tant que valeur de retour, je recommande d’utiliser le type ResponseEntity> . Parce que les données produites dans le corps JSON doivent être un tableau ou un object en fonction de ses spécifications, plutôt qu’une simple chaîne simple. Cela peut parfois causer des problèmes (par exemple, des observables dans Angular2).

Différence:

a renvoyé Ssortingng comme json: "example"

renvoyé List tant que json: ["example"]

Ajoutez l’annotation @ResponseBody , qui écrira les données de retour dans le stream de sortie.

Je sais que cette question est ancienne mais je voudrais aussi consortingbuer:

La principale différence entre les autres réponses est le retour de hashmap.

 @GetMapping("...") @ResponseBody public HashMap endPointExample(...) { HashMap rtn = new LinkedHashMap(); rtn.put("pic", image); rtn.put("potato", "King Potato"); return rtn; } 

Cela va retourner:

 {"pic":"a17fefab83517fb...beb8ac5a2ae8f0449","potato":"King Potato"} 

Dans Spring MVC 4, le type de réponse par défaut pour les objects est JSON. Donc, tout ce que vous avez à faire est d’emballer votre chaîne dans un object.

  public class SsortingngResponse { private Ssortingng response; public SsortingngResponse(Ssortingng s) { this.response = s; } // getters and setters } 

Aucune modification du contrôleur, sauf le renvoi de SsortingngResponse place de la chaîne.

Ajouter cette annotation à votre méthode

 @RequestMapping(value = "/getSsortingng", method = RequestMethod.GET, produces = "application/json")