Spring Boot如何在注册前检查ObjectMapper模块是否已注册?
避免ObjectMapper重复注册模块的两种实用方法
在Spring Boot里使用ObjectMapper时,确实会遇到重复注册模块导致的冗余问题,Jackson本身提供了两种直接的检查方式,不用自己写复杂逻辑:
通过模块类型检查(最直观)
用findModuleByType()方法直接查找已注册的对应类型模块,如果返回null,说明还没注册,再调用registerModule():ApplicationContext context = event.getApplicationContext(); TextModule module = (TextModule) context.getBean("textModule"); ObjectMapper mapper = ObjectMapper.getObjectMapper(); if (mapper.findModuleByType(TextModule.class) == null) { mapper.registerModule(module); }通过模块ID检查
每个Jackson模块都有唯一的TypeId,可以用getRegisteredModuleIds()获取所有已注册模块的ID集合,再判断当前模块的ID是否在集合中:ApplicationContext context = event.getApplicationContext(); TextModule module = (TextModule) context.getBean("textModule"); ObjectMapper mapper = ObjectMapper.getObjectMapper(); if (!mapper.getRegisteredModuleIds().contains(module.getTypeId())) { mapper.registerModule(module); }
另外提个Spring Boot环境的小技巧:如果你的模块是通过@Bean声明的,Spring Boot会自动把它注册到所有ObjectMapper实例中,完全不用手动调用registerModule(),从根源上避免重复注册问题:
@Bean public Module textModule() { return new TextModule(); }
内容的提问来源于stack exchange,提问作者Denis Kisina
相关产品推荐
相关产品推荐

