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")
- TimerTask与Thread.sleep vs Handler postDelayed – 每N毫秒最准确的调用函数?
- 如何在Java中closures自己的线程?
- Java中未初始化的variables和成员
- 如何在Android中将文件写入外部公共存储,以便从Windows中可见?
- 快速阅读文本文件的最后一行?
- java.lang.UnsupportedClassVersionError:.class文件中的版本号不正确?
- 在Hibernate Validator 4.1+中,@NotNull,@NotEmpty和@NotBlank有什么区别?
- getString()和optString()之间的区别
- 什么是Java中的string池?