SpringMVC 中controller 中⽅法返回类型为
ResponseEntityStr 。。。
返回类型为ResponseEntity<T>
代表我们返回的数据是⼀个对象,在springMVC 中,请求数据到对象和对象到响应数据的转换是通过消息转换器来完成的。
HttpMessageConverter 是消息转换器的顶层接⼝,所有的消息转换器都必须实现这个接⼝
[java]
01. package org.verter; 02. 03. import java.io.IOException; 04. import java.util.List; 05. 06. import org.springframework.http.HttpInputMessage; 07. import org.springframework.http.HttpOutputMessage; 08. import org.springframework.http.MediaType; 09. 10. public interface HttpMessageConverter<T> { 11. 12. boolean canRead(Class<?> clazz, MediaType mediaType); 13. 14. boolean canWrite(Class<?> clazz, MediaType mediaType); 15. 16. List<MediaType> getSupportedMediaTypes(); 17. 18. T read(Class<? extends T> clazz, HttpInputMessage inputMessage) 19. throws IOException, HttpMessageNotReadableExceptio
n; 20. 21. void write(T t, MediaType contentType, HttpOutputMessage outputMessage) 22. throws IOException, HttpMessageNotWritableException; 23. 24. }
54.
从其中我们可以到添加StringHttpMessageConverter转换器的代码段
和之前输出JSON⽤到的MappingJackson2HttpMessageConverter转换器,这也可以看处springMVC
对JSON的⽀持为什么要加⼊jackson的依赖。
我这⾥为什么要单独挑出这两个转换器,是为了说明他们的区别和调⽤时机的,和进⼀步引出问题。
a)之前如果我们要把对象以JSON格式输出,可以给controller的⽅法加@ResponseBody注解,到后来我们依照resultful的思想来做项⽬时,函数的返回值不会再是POJO,⽽是ResponseEntity<T>,有了它我们向往前台输出对象对应的JSON就不再需要再添加@ResponseBody注解了
b)在SpringMVC中是怎么把我们的对象转换为JSON输出的呢,这⾥依旧要提到spring mvc的消息转换器,是它完成了这个转换过程。
c)但是函数值为ResponseEntity<T>并不是所有的对象都会再后来转换为json,⽐如String,它会调⽤对应的StringHttpMessageConverter的消息转换器,⽽不是MappingJackson2HttpMessageConverter转换器。所以如果返回值类型为ResponseEntity<String> ,要输出json需要我们⾃⼰把json数据写到string ⾥,spring是不会帮我们转换的。
接下来我们看StringHttpMessageConverter.class类 org.verter.StringHttpMessageConverter
发现它的默认转换编码是iso-8859-1,前台解码⼀般⽤utf-8,编解码不⼀致导致乱码,但我们发现这
给类的构造⽅法预留了⼀个参数让我⾃⼰指定编码,这⾥我们看到了⼀丝希望哈哈。
解决办法:
我们只要在l 配置⽂件中⾃⼰为这个消息转换器配置utf-8编码就ok 了01. public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { 02. 03. public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); 04. private final Charset defaultCharset; 05. … 06. public StringHttpMessageConverter() { 07. this (DEFAULT_CHARSET); 08. } 09. 10. public StringHttpMessageConverter(Charset defaultCharset) { 11. super (new MediaType("text", "plain", defaultCharset), MediaType.ALL); 12. this .defaultCharset = defaultCharset; 13. this .availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values()); 14. } 15. … 16. } 17. [html]
01. <mvc:annotation-driven> 02. <!-- ⾃定义消息转换器 --> 03. <mvc:message-converters register-defaults ="true"> 04. <!-- ⾃定义消息转换器,设置编码为utf-8,防⽌responseEntity<String>转换成json 对象输出乱码 --> 05. <bean class ="org.verter.StringHttpMessageConverter"> 06. <constructor-arg index ="0" value ="utf-8"></constructor-arg> 07. </bean> 08. </mvc:message-converters> 09. </mvc:annotation-driven>
10.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论