问题
回到一开始的问题 某自动识别厂商传递过来的请求为GBK
那么我们需要如何处理呢?
但是除了这个请求之外其他请求均是UTF8
对于这种场景我们要如何呢?
分析
由于现在请求均是post 并且我们基本上均使用了RequestBody标签
因此实质上流不是有servlet进行处理的而是通过MessageConverter进行处理的
对于我们系统来说 绝大部分是fastjson https://github.com/alibaba/fastjson
目前fastjson配置如下
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNullNumberAsZero);
config.setSerializeFilters(serializeFilters());
return config;
fastjson在默认场景下使用UTF8编码~万国码万岁!
那么对于某些使用GBK编码如何呢???
手动设置成GBK吧!
FastJsonConfig fastJsonConfig = createFastJsonConfig();
fastJsonConfig.setCharset(Charset.forName("GBK"));
但是这个fastjson貌似不能自动根据不同contentType的encode。
一旦出现一个项目既要支持GBK又要支持UTF8需要如何处理呢???
碰到这种需求 比如 针对某个Controller支持GBK
public class FastJsonHttpMessageGBKConverter extends FastJsonHttpMessageConverter {
public FastJsonHttpMessageGBKConverter() {
}
@Override
protected boolean supports(Class<?> clazz) {
return clazz == AnonCarWashController.class;
}
}
为了让GBK的messageConverator尽量提前因此注意一下顺序
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(createFastJsonHttpMessageGBKConverter());
converters.add(createExcelHttpMessageConverter());
converters.add(createFastJsonHttpMessageConverter());
}
private FastJsonHttpMessageConverter createFastJsonHttpMessageGBKConverter() {
FastJsonHttpMessageGBKConverter gbkConverter = new FastJsonHttpMessageGBKConverter();
FastJsonConfig fastJsonConfig = createFastJsonConfig();
fastJsonConfig.setCharset(Charset.forName("GBK"));
gbkConverter.setFastJsonConfig(fastJsonConfig);
return gbkConverter;
}
private FastJsonHttpMessageConverter createFastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
converter.setFastJsonConfig(createFastJsonConfig());
return converter;
}
private FastJsonConfig createFastJsonConfig() {
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNullNumberAsZero);
config.setSerializeFilters(serializeFilters());
return config;
}
这样就可以让AnonCarWashController下的请求全部以GBK完成!
总结
某自动识别厂家坑爹的编码~