用fastjson消息转换器解决@RequestBody适配入参大小写问题
背景
由于项目需要重构,把原来的struct2改成springmvc模式。旧项目用的是古老的gson,而且把所有入参都适配为小写。
可能是以前对接的时候给的文档入参都是小写,比如用户名,入参是username,实体类名是userName。
后面重构的时候我发现用@requestBody是转换不了这种的,因为区分大小写。
这样子如果入参是username,实体类是userName的话是注入不了属性。用于之前的项目实体类参数没有按照规范,各种各样的格式都有,有驼峰的,下划线的,全小写的,所以我们要解决这种问题。
解决问题
第一种办法:用JSONObject接收入参,在代码里用fastjson转换成VO,fastjson新版本比较牛逼,能适配到大小写和下划线的参数。
缺点:json作入参不够规范
第二种办法:
springmvc是默认使用jackson转换器转换,但是这种大小写问题他没有适配。用fastjson消息转换器转换,灵感是通过第一种办法来的,如果用fastjson能转换,那不如直接在requestBody的时候把他转换就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | @Configuration public class MyMvcConfig implements WebMvcConfigurer { /** * 自定义消息转换器,覆盖默认 */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> messageConverters) { // 清理默认 messageConverters.clear(); // 添加 messageConverters.add( new ByteArrayHttpMessageConverter()); messageConverters.add( new StringHttpMessageConverter()); messageConverters.add( new ResourceHttpMessageConverter()); messageConverters.add( new ResourceRegionHttpMessageConverter()); messageConverters.add( new AllEncompassingFormHttpMessageConverter()); // 配置FastJson并添加 FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); fastJsonHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes()); // 支持的MediaType fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8); // 默认字符集 fastJsonHttpMessageConverter.setFastJsonConfig(getFastJsonConfig()); messageConverters.add(fastJsonHttpMessageConverter); } /** * FastJson 配置 */ private FastJsonConfig getFastJsonConfig() { FastJsonConfig fastJsonConfig = new FastJsonConfig(); // 配置序列化器功能 fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullListAsEmpty ); // 序列化配置,将Long类型转为字符串 //不要使用全局的,会影响其他地方的JSON序列化SerializeConfig serializeConfig = SerializeConfig.globalInstance; SerializeConfig serializeConfig = new SerializeConfig(); serializeConfig.put(BigInteger. class , ToStringSerializer.instance); serializeConfig.put(Long. class , ToStringSerializer.instance); serializeConfig.put(Long.TYPE, ToStringSerializer.instance); serializeConfig.put( long . class , ToStringSerializer.instance); fastJsonConfig.setSerializeConfig(serializeConfig); return fastJsonConfig; } /** * 配置支持的媒体类型 */ private List<MediaType> getSupportedMediaTypes() { List<MediaType> supportedMediaTypes = new ArrayList<>(); supportedMediaTypes.add(MediaType.APPLICATION_JSON); supportedMediaTypes.add( new MediaType( "application" , "*+json" )); return supportedMediaTypes; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-07-19 B站高可用架构总结