转载

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

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 即可。

原文  http://blog.didispace.com/fastjson-swagger-solution/
正文到此结束
Loading...