如今茬末,越來越多的Spring MVC項目都選擇使用FastJson做為Json解析框架,并且都會添加類似如下配置以支持FastJson:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter =
new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
MediaType mediaTypeJson =
MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE);
supportedMediaTypes.add(mediaTypeJson);
converter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig config = new FastJsonConfig();
config.getSerializeConfig()
.put(Json.class, new SwaggerJsonSerializer());
config.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect);
converter.setFastJsonConfig(config);
converters.add(converter);
}
}
但是隅熙,在使用Feign的Spring Cloud微服務項目中哲戚,要特別注意需要為Feign單獨配置FastJson,因為Feign并不共用Spring MVC的消息轉換器鏈荤堪,而且它默認使用的是Jackson Json解析庫。這會導致混亂枢赔,甚至出現(xiàn)序列化/反序列化錯誤澄阳。
舉個例子:
Bean的屬性名與Json的屬性名不一樣,使用@JSONField()注解做轉換踏拜。
public class Bean {
@JSONField(name = "json_name")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
但是碎赢,這個注解只有FastJson認得,Jackson并不認速梗。所以在Feign將Bean轉成Json的時候肮塞,將把name作為key名稱輸出(而我期望的時候,輸出json_name的key名稱)姻锁,導致在Feign的服務端枕赵,以Spring MVC方式接收的時候,F(xiàn)astJson由于找不到json_name而不能正確給Bean的name屬性賦值位隶。
解決辦法就是給Feign也添加FastJson的支持拷窜,如下:
@Configuration
public class FeignConfig {
@Bean
public Encoder feignEncoder() {
return new SpringEncoder(feignHttpMessageConverter());
}
private ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
final HttpMessageConverters httpMessageConverters =
new HttpMessageConverters(getFastJsonConverter());
return () -> httpMessageConverters;
}
private FastJsonHttpMessageConverter getFastJsonConverter() {
FastJsonHttpMessageConverter converter =
new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
MediaType mediaTypeJson =
MediaType.valueOf(MediaType.APPLICATION_JSON_UTF8_VALUE);
supportedMediaTypes.add(mediaTypeJson);
converter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig config = new FastJsonConfig();
config.getSerializeConfig()
.put(Json.class, new SwaggerJsonSerializer());
config.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect);
converter.setFastJsonConfig(config);
return converter;
}
}