encode了解一下(八)

问题

回到一开始的问题 某自动识别厂商传递过来的请求为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吧!

扫描二维码关注公众号,回复: 972337 查看本文章
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完成!

总结

某自动识别厂家坑爹的编码~

猜你喜欢

转载自my.oschina.net/qixiaobo025/blog/1816337