Spring MVC – 如何在Rest Controller中将简单string作为JSON返回

我的问题实际上是这个问题的后续。

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

在上面的例子中,Spring会在响应主体中join“Hello World”。 我怎样才能返回一个string作为JSON响应? 我知道我可以添加引号,但是这更像是一个黑客。

请提供任何示例来帮助解释这个概念。

注意:我不想直接写入HTTP响应正文,我想以JSON格式返回string(我正在使用带有RestyGWT的控制器,要求响应采用有效的JSON格式)。

或者返回text/plain (如从Spring MVC 3 Controller返回唯一string消息 )或者包装String是一些对象

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

将你的响应types设置为application/json

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

你会看到一个JSON

 { "response" : "your string value" } 

JSON本质上是PHP或JAVA上下文中的string。 这意味着有效的JSONstring可以返回响应。 以下应该工作。

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

这对于简单的string响应是可以的。 但是对于复杂的JSON响应,您应该使用Shaun所述的包装类。

由于我发布这个问题,我已经开始使用JSONObject (maven 依赖信息 )。 特别是与一个团队合作,我发现期望一个string被返回而不是一些包装对象,当我想要的只是一个简单的string更容易。

用法示例:

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

只需注销默认的StringHttpMessageConverter实例:

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

使用控制器操作处理程序方法和控制器exception处理程序进行testing:

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

最后说明:

  • extendMessageConverters从Spring 4.1.3开始extendMessageConverters用,如果在以前的版本上运行,你可以使用configureMessageConverters实现相同的技术,只需要多一点工作。
  • 这是许多其他可能方法的一种方法,如果您的应用程序只返回JSON而没有其他内容types,则最好跳过默认转换器并添加一个jackson转换器。 另一种方法是添加默认的转换器,但不同的顺序,以便jackson转换器之前的string之一。 这应该允许控制器操作方法决定如何根据响应的媒体types来转换string。

添加@ResponseBody注解,这将在输出stream中写入返回数据。

@RequestMapping注释中添加produces = "application/json" ,如下所示:

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

提示:作为返回值,我build议使用ResponseEntity<List<T>>types。 因为JSON体中生成的数据需要根据其规范而成为数组对象 ,而不是一个简单的string 。 它有时可能会导致问题(例如Angular2中的Observable)。

区别:

返回String为json: "example"

返回List<String>作为json: ["example"]

在属性response ,您可以轻松地返回带有String JSON ,如下所示

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

将此注释添加到您的方法

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