2016-08-01補充:該問題解決已合并入fastjson 1.2.15版本,請使用1.2.15+版本就不需要做下面的改造了
FastJson是阿里巴巴開源的高性能JSON轉(zhuǎn)換工具。我們在使用Spring MVC需要進行JSON轉(zhuǎn)換時,通常會使用FastJson提供的FastJsonHttpMessageConverter。但是在我們使用了Swagger2的工程中使用它之后,我們的Api文檔就無法工作了(雖然swagger-ui界面可以展現(xiàn),但是沒有任何api內(nèi)容,并且通過訪問/v2/api-docse
,我們得到的返回時{}
,而不是之前的文檔配置內(nèi)容了。
通過下載FastJson源碼之后,單步調(diào)試可以確定問題在于FastJson默認提供的Serializer
轉(zhuǎn)換springfox.documentation.spring.web.json.Json
的結(jié)果為{}
。
下面具體說說,如何來解決這個問題。
更新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>
實現(xiàn)自定義序列化類
通過實現(xiàn)ObjectSerializer
和ObjectDeserializer
接口,分別定義目標的序列化實現(xiàn)和反序列化實現(xiàn)。這里,我們只需要重寫write
方法,實現(xiàn)序列化過程,將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
源碼,并單步調(diào)試即可知道swagger-ui所需要的返回內(nèi)容就是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中加入自定義序列化類
實現(xiàn)FastJsonHttpMessageConverter的子類,并在構(gòu)造函數(shù)中,加入springfox.documentation.spring.web.json.Json
類與SwaggerJsonSerializer
的映射關(guān)系,使得在轉(zhuǎn)換的時候,碰到springfox.documentation.spring.web.json.Json
就使用我們自己實現(xiàn)的SwaggerJsonSerializer
來進行轉(zhuǎn)換,具體如下:
public class FastJsonHttpMessageConverterEx extends FastJsonHttpMessageConverter {
public FastJsonHttpMessageConverterEx() {
super();
this.getFastJsonConfig().getSerializeConfig().put(Json.class, SwaggerJsonSerializer.instance);
}
}
最后,在配置文件中用FastJsonHttpMessageConverterEx
替換原來的FastJsonHttpMessageConverter
即可。