SpringMVC中使用FastJsonHttpMessageConverter时Swagger2失效的解决办法

简介: 2016-08-01补充:该问题解决已合并入fastjson 1.2.15版本,请使用1.2.15+版本就不需要做下面的改造了FastJson是阿里巴巴开源的高性能JSON转换工具。

2016-08-01补充:该问题解决已合并入fastjson 1.2.15版本,请使用1.2.15+版本就不需要做下面的改造了

FastJson是阿里巴巴开源的高性能JSON转换工具。我们在使用Spring MVC需要进行JSON转换时,通常会使用FastJson提供的FastJsonHttpMessageConverter。但是在我们使用了Swagger2的工程中使用它之后,我们的Api文档就无法工作了(虽然swagger-ui界面可以展现,但是没有任何api内容,并且通过访问/v2/api-docse,我们得到的返回时{},而不是之前的文档配置内容了。

通过下载FastJson源码之后,单步调试可以确定问题在于FastJson默认提供的Serializer转换springfox.documentation.spring.web.json.Json的结果为{}

下面具体说说,如何来解决这个问题。

更新fastjson版本

更新fastjson版本为1.2.10以上,在之前的版本中FastJsonHttpMessageConverter没有暴露fastjson对Serializer配置。更新到新版本之后,可以方便我们加入对springfox.documentation.spring.web.json.Json的序列化支持。

本文采用1.2.12为例:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.12</version>
</dependency>

实现自定义序列化类

通过实现ObjectSerializerObjectDeserializer 接口,分别定义目标的序列化实现和反序列化实现。这里,我们只需要重写write方法,实现序列化过程,将springfox.documentation.spring.web.json.Json对象中的json文档正确返回即可。

public class Json {
    private final String value;

    public Json(String value) {
        this.value = value;
    }

    @JsonValue
    @JsonRawValue
    public String value() {
        return this.value;
    }
}

通过查看springfox.documentation.spring.web.json.Json源码,并单步调试即可知道swagger-ui所需要的返回内容就是Json对象中的value字段提供的。因此我们只需要在write方法中,将Json对象的value值输出即可,具体如下:

public class SwaggerJsonSerializer implements ObjectSerializer, ObjectDeserializer {

    public final static SwaggerJsonSerializer instance = new SwaggerJsonSerializer();

    @Override
    public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
        SerializeWriter out = serializer.getWriter();
        Json json = (Json) object;
        out.write(json.value());
    }


    @Override
    public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return null;
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }

}

FastJsonHttpMessageConverter中加入自定义序列化类

实现FastJsonHttpMessageConverter的子类,并在构造函数中,加入springfox.documentation.spring.web.json.Json类与SwaggerJsonSerializer的映射关系,使得在转换的时候,碰到springfox.documentation.spring.web.json.Json就使用我们自己实现的SwaggerJsonSerializer来进行转换,具体如下:

public class FastJsonHttpMessageConverterEx extends FastJsonHttpMessageConverter {

    public FastJsonHttpMessageConverterEx() {
        super();
        this.getFastJsonConfig().getSerializeConfig().put(Json.class, SwaggerJsonSerializer.instance);
    }

}

最后,在配置文件中用FastJsonHttpMessageConverterEx替换原来的FastJsonHttpMessageConverter即可。

目录
相关文章
|
JSON 前端开发 fastjson
SpringMVC中使用FastJsonHttpMessageConverter时Swagger2失效的解决办法
SpringMVC中使用FastJsonHttpMessageConverter时Swagger2失效的解决办法
454 0
|
Java API Spring
MP实战系列(十)之SpringMVC集成SpringFox+Swagger2
该示例基于之前的实战系列,如果公司框架是使用JDK7以上及其Spring+MyBatis+SpringMVC/Spring+MyBatis Plus+SpringMVC可直接参考该实例。 不过建议最好采用的是JDK8+Spring+MyBatis Plus+SpringMVC,因为本示例就是基于这个。
1710 0
|
API
springmvc+swagger构建Restful风格文档
  本次和大家分享的是java方面的springmvc来构建的webapi接口+swagger文档;上篇文章分享.net的webapi用swagger来构建文档,因为有朋友问了为啥.net有docpage文档你还用swagger,这里主要目的是让接口文档统一,当操作多种开发语言做接口时,如果有统一风格的api文档是不是很不错;还有就springcloude而言,微服务如果有很多的话,使用swagger自动根据服务serverid来加载api文档是很方便的。
1476 0
|
JSON API 数据格式
SpringMVC 中配置 Swagger 插件.
一、简介  Swagger的目标是为REST API定义一个与语言无关的标准接口,允许用户发现和理解计算机服务的功能,而无需访问源代码。当通过Swagger正确定义时,用户可以用最少量的实现逻辑理解远程服务并与之交互。
1585 0
|
XML 前端开发 Java
SpringMVC+Swagger详细整合
一、新建maven工程导入正确的pom文件 还是那句话,包导入正确就成功了80%。剩下的20%慢慢攻克吧。 4.0.0 com.apidoc.demotest apidoc 0.0.
1367 0
|
Web App开发
SpringMVC集成Swagger
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/58630864 此前写过一个关于SpringBoot集成Swagger的帖子,因为有的项目是SpringMVC的,所以也简单整理了一下,基本一致。
1163 0
|
前端开发 Java API
dubbo2.5-spring4-mybastis3.2-springmvc4-mongodb3.4-redis3(十)之Spring MVC中使用 Swagger2 构建Restful API
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/55047193 1、Swagger2是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。
1252 0