一直以来都想找到如何在springboot实现,即支持JSON数据返回格式,也能同时支持XML.今天终于实现了,并且本人实测,所以说是质量保证,哈哈。
所以先来点基础知识普及吧。
用过Springboot的同学都知道,在Springboot里添加一个converter的方式有三种,代码以及说明如下:
// 添加converter的第一种方式,代码很简单,也是推荐的方式
// 这样做springboot会把我们自定义的converter放在顺序上的最高优先级(List的头部)
// 即有多个converter都满足Accpet/ContentType/MediaType的规则时,优先使用我们这个
@Bean
public JavaSerializationConverter javaSerializationConverter() {
return new JavaSerializationConverter();
}
// 添加converter的第二种方式
// 通常在只有一个自定义WebMvcConfigurerAdapter时,会把这个方法里面添加的converter(s)依次放在最高优先级(List的头部)
// 虽然第一种方式的代码先执行,但是bean的添加比这种方式晚,所以方式二的优先级 大于 方式一
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// add方法可以指定顺序,有多个自定义的WebMvcConfigurerAdapter时,可以改变相互之间的顺序
// 但是都在springmvc内置的converter前面
converters.add(new JavaSerializationConverter());
}
// 添加converter的第三种方式
// 同一个WebMvcConfigurerAdapter中的configureMessageConverters方法先于extendMessageConverters方法执行
// 可以理解为是三种方式中最后执行的一种,不过这里可以通过add指定顺序来调整优先级,也可以使用remove/clear来删除converter,功能强大
// 使用converters.add(xxx)会放在最低优先级(List的尾部)
// 使用converters.add(0,xxx)会放在最高优先级(List的头部)
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new JavaSerializationConverter());
}
这里我们采用第三种方式添加Fastjson转换器
@Configuration
public class FastJsonConfiguration extends WebMvcConfigurationSupport
{
@Bean
public FastJsonHttpMessageConverter fastJsonHttpMessageConverter()
{
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//by default, fastjson does not output the null value unless SerializerFeature.WriteMapNullValue is added
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
return fastJsonHttpMessageConverter;
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(0,fastJsonHttpMessageConverter());
}
}
这样,我们的项目里就有了JSON的转换器了,相应的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.55</version>
</dependency>
下面就是关键了,如何同时支持XML呢?第一步,添加依赖
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-xml-provider</artifactId>
</dependency>
这个时候,我们的项目就能同时支持数据以XML或者JSON返回,只需要在前端调用的时候添加
Accept: application/xml 或者Accept: application/json.
如果有同学觉得不想指定Accept,想直接通过API URL来指定是返回xml还是JSON,还可以参考以下的方式
首先,配置一下 WebMvcConfigurationSupport
@Configuration
public class FastJsonConfiguration extends WebMvcConfigurationSupport
{
@Override
protected void configurePathMatch(PathMatchConfigurer configurer) {
/**
* setUseSuffixPatternMatch : 设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认真即匹配;
* setUseTrailingSlashMatch : 设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认真即匹配
*/
configurer.setUseSuffixPatternMatch(true)
.setUseTrailingSlashMatch(true);
}
}
再定义个方法来演示如何使用
@ApiOperation(value = "get the user info by soeid", notes = "fetch the data from user table with the passed soeid")
@ApiImplicitParam(paramType = "path", name = "soeid", value = "need to pass the soeid", required = true, dataType = "String")
@GetMapping(value="/getUserInfo/{soeid}")
public BaseResult<Userqt> getUserInfo(@PathVariable(value = "soeid") String soeid)
{
// logger.info("call the method to get the user info by SOEID");
Userqt user = userqtMapper.selectUserBySOEID(soeid);
return ResultUtil.success(user);
}
http://localhost:8010/getUserInfo/aa.json 返回JSON
http://localhost:8010/getUserInfo/aa.xml 返回xml