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版本为 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>
通过实现 ObjectSerializer
和 ObjectDeserializer
接口,分别定义目标的序列化实现和反序列化实现。这里,我们只需要重写 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的子类,并在构造函数中,加入 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
即可。