Spring MVC 3.0.1 Controller如何将字符串以JSON格式返回?
Spring MVC 3.0.1 接口返回JSON Content-Type异常解决方案
Spring 3.0.1版本未支持
@RequestMapping的produces属性,且@ResponseBody处理字符串返回值时,默认使用StringHttpMessageConverter,其默认编码为ISO-8859-1,默认Content-Type为text/plain,因此无法直接返回JSON类型响应。
方案1:Controller层返回ResponseEntity(无需修改全局配置,推荐)
直接在方法中手动指定响应头的Content-Type,3.0.x版本原生支持ResponseEntity,修改代码如下:
@RequestMapping(value = "/XXX") public ResponseEntity<String> getResponse(String object) { // 原有业务逻辑保持不变,此处省略 logger.info("jsonArray string: " + jsonArray.toString()); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json;charset=UTF-8"); return new ResponseEntity<String>(jsonArray.toString(), headers, HttpStatus.OK); }
该方案仅对当前接口生效,不影响其他接口逻辑
方案2:修改返回值类型,走Jackson自动序列化
你已经引入了Jackson依赖,只要将方法返回值从String改为实际要返回的对象类型(比如本例的JSONArray,或者自定义POJO),Spring会自动匹配MappingJacksonHttpMessageConverter进行序列化,自动返回application/json类型的响应:
@RequestMapping(value = "/XXX") @ResponseBody public JSONArray getResponse(String object) { // 原有业务逻辑保持不变,此处省略 logger.info("jsonArray string: " + jsonArray.toString()); return jsonArray; }
方案3:全局配置消息转换器(适合所有接口统一返回JSON的场景)
在Spring MVC的核心配置文件(通常为dispatcher-servlet.xml)中,修改AnnotationMethodHandlerAdapter的消息转换器配置,覆盖默认的StringHttpMessageConverter编码和媒体类型:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!-- 配置String类型返回的消息转换器,默认编码UTF-8,支持JSON类型 --> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <!-- 配置Jackson对象序列化转换器 --> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json;charset=UTF-8"/> </bean> </list> </property> </bean>
该方案会全局生效,所有@ResponseBody返回String的接口都会使用该配置,若存在需要返回纯文本的接口需谨慎使用
内容的提问来源于stack exchange,提问作者Ibrahim Ates
相关产品推荐
相关产品推荐

