一直以来都想找到如何在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