Spring使用FastJson作为消息转换器时,不能使用Swagger的问题

88357660 2016-10-25

因为Fast作为JSON的序列化与反序列化一些优点,在项目中使用了FastJson库的FastJsonHttpMessageConverter4作为Spring的消息转换器,可替换后,发现http://localhost:8081/swagger-ui.html页面能打开,但API内容都不见了。但v2/api-docs倒是能打开。

替换回Spring默认的Jackson2,页面打开正常。经过抓包,发现使用不同的转换器时,页面打开请求的URL是不同的。使用FastJson时,到swagger-resources/configuration/ui请求后,就结束了。而默认的Jackson2在此之后,又多了几个请求。对比swagger-resources/configuration/ui请求的响应数据,发现Jacson2比FastJson多了几个JSON数据项。

再返回系统中,查看日志。Debug跟踪发现MessageConverter的writeInternal方法内,写入的是UiConfiguration对象。而该类的一些属性使用了一些Jackson2的注解。正是这些注解的属性在FastJson中没有输出出来。这个类的输出,发现使用Jackson2来进行。

于是新写一个类,继承FastJsonHttpMessageConverter4,覆写writeInternal方法。使用该类作为消息转换器。测试正常。

public class SwaggerFastJsonHttpMessageConverter4 extends FastJsonHttpMessageConverter4 {
	private ObjectMapper mapper = new ObjectMapper();

	@Override
	protected void writeInternal(Object obj, //
			Type type, //
			HttpOutputMessage outputMessage //
	) throws IOException, HttpMessageNotWritableException {
		if (type == springfox.documentation.swagger.web.UiConfiguration.class) {
			HttpHeaders headers = outputMessage.getHeaders();
			ByteArrayOutputStream outnew = new ByteArrayOutputStream();
			mapper.writeValue(outnew, obj);
			outnew.flush();
			headers.setContentLength(outnew.size());
			OutputStream out = outputMessage.getBody();
			outnew.writeTo(out);
			outnew.close();
		} else {
			super.writeInternal(obj, type, outputMessage);
		}
	}
}

相关推荐