@ResponseBody注解支持的json包
程序员文章站
2022-07-12 19:41:24
...
起因,@ResponseBody注解在引用FastJson包的情况下失效。考虑到@ResponseBody只支持Jackson,故去看一看源码是如何调用的
查看注解扫描源码<mvc:annotation-driven/>
进入RequestMappingHandlerAdapter
中查看
会发现构造器中引入诸多HttpMessageConverter,其中还有AllEncompassingFormHttpMessageConverter,进入查看
public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConverter {
private static final boolean jaxb2Present = ClassUtils.isPresent("javax.xml.bind.Binder", AllEncompassingFormHttpMessageConverter.class.getClassLoader());
private static final boolean jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader()) && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", AllEncompassingFormHttpMessageConverter.class.getClassLoader());
private static final boolean jackson2XmlPresent = ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", AllEncompassingFormHttpMessageConverter.class.getClassLoader());
private static final boolean gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", AllEncompassingFormHttpMessageConverter.class.getClassLoader());
public AllEncompassingFormHttpMessageConverter() {
this.addPartConverter(new SourceHttpMessageConverter());
if(jaxb2Present && !jackson2XmlPresent) {
this.addPartConverter(new Jaxb2RootElementHttpMessageConverter());
}
if(jackson2Present) {
this.addPartConverter(new MappingJackson2HttpMessageConverter());
} else if(gsonPresent) {
this.addPartConverter(new GsonHttpMessageConverter());
}
if(jackson2XmlPresent) {
this.addPartConverter(new MappingJackson2XmlHttpMessageConverter());
}
}
}
可以发现默认其支持Jackson和Gson,并不支持FastJson
源码基于spring4.3.10
另外,在所支持的json中已配置默认字符集为utf-8
查看GsonHttpMessageConverter构造器
查看MappingJackson2HttpMessageConverter构造器
其调用了父类的构造器,再去看父类里面看
可以看见默认字符集都是utf-8
如果不使用所支持的Jackson和Gson,则需要注意字符集的问题
可在@RequestMapping注解中使用produces来配置charset
如@RequestMapping(value = "demo", produces = "application/json;charset=utf-8")
推荐阅读
-
关于package.json中npm依赖包版本前的符号含义解析
-
配置iis6,iis7.5支持解析.json格式文件的方法
-
解决使用json-lib包实现xml转json时空值被转为空中括号的问题
-
Flask 让jsonify返回的json串支持中文显示的方法
-
php5.4以下版本json不支持不转义内容中文的解决方法
-
json-lib包引入失败问题的解决办法
-
spring注解在自定义jar包中无法被扫描的解决方案
-
Web API对application/json内容类型的CORS支持
-
json学习初体验--使用第三方的jar包实现bean、List、map创建json格式
-
利用@Conditional注解实现扫描不同的包路径