改造Spring Boot版Kie Server遇Jackson版本冲突类路径问题求助
Spring Boot集成Kie Server解决Jackson版本冲突方案
问题根源
现有Spring Boot 2.6.6服务通过传递依赖引入com.fasterxml.jackson.core:jackson-databind:2.13.2.2,而使用的kie-server-spring-boot-starter-drools(7.53.0.Final至7.73.0.Final)依赖Jackson 2.11.2。版本差异导致JSON编组阶段触发NoSuchFieldError: _typeCache异常,该字段在Jackson 2.13.x中已被移除或重命名。
可行解决方案
方案1:统一Jackson版本为Kie Server兼容版本
- 在
pom.xml中强制指定Jackson版本为Kie Server依赖的2.11.2,覆盖Spring Boot的传递依赖:
<properties> <jackson.version>2.11.2</jackson.version> </properties>
- 验证Spring Boot 2.6.6与Jackson 2.11.2的兼容性,测试现有业务的Jackson序列化/反序列化逻辑是否正常。
方案2:自定义JSONMarshaller适配Jackson 2.13.x
- 继承Kie Server的
JSONMarshaller,重写configureMarshaller方法适配Jackson 2.13.x API:
public class CustomJackson213Marshaller extends JSONMarshaller { public CustomJackson213Marshaller(Set<Class<?>> classes, ClassLoader classLoader, MarshallingFormat format) { super(classes, classLoader, format); } @Override protected void configureMarshaller(Set<Class<?>> classes, ClassLoader classLoader) { ObjectMapper mapper = getObjectMapper(); // 适配Jackson 2.13.x的TypeResolverBuilder实现 TypeResolverBuilder<?> typer = new DefaultTypeResolverBuilder.DefaultTypeResolverBuilderImpl(DefaultTyping.NON_FINAL) { @Override public boolean useForType(JavaType t) { return classes.contains(t.getRawClass()); } }; mapper.setDefaultTyping(typer); // 保留Kie Server所需的基础配置 mapper.registerModule(new Jdk8Module()); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); } }
- 自定义
MarshallerBuilder绑定自定义实现:
public class CustomMarshallerBuilder extends BaseMarshallerBuilder { @Override public Marshaller build(Set<Class<?>> classes, ClassLoader classLoader, MarshallingFormat format) { if (format == MarshallingFormat.JSON) { return new CustomJackson213Marshaller(classes, classLoader, format); } return super.build(classes, classLoader, format); } }
- 服务启动时替换默认Marshaller工厂:
MarshallerFactory.registerMarshallerBuilder(MarshallingFormat.JSON, new CustomMarshallerBuilder());
方案3:升级Kie Server版本至兼容Jackson 2.13.x的版本
- 升级
kie-server-spring-boot-starter-drools到7.74.0.Final及以上版本,该版本已将Jackson依赖升级至2.13.x,可直接匹配现有Spring Boot的Jackson版本。
方案4:用Spring Boot全局ObjectMapper覆盖Kie Server配置
- 配置Spring Boot全局
ObjectMapper,强制Kie Server使用该实例:
@Configuration public class JacksonConfig { @Bean @Primary public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 配置Kie Server所需的类型解析规则 TypeResolverBuilder<?> typer = new DefaultTypeResolverBuilder.DefaultTypeResolverBuilderImpl(DefaultTyping.NON_FINAL) { @Override public boolean useForType(JavaType t) { return t.getRawClass().getName().startsWith("org.kie.server.api.model"); } }; mapper.setDefaultTyping(typer); mapper.registerModule(new Jdk8Module()); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return mapper; } }
- 确保Kie Server的Marshaller注入Spring容器中的
ObjectMapper,可通过自定义KieServerConfiguration实现。
内容的提问来源于stack exchange,提问作者Sethukumar Ramachandran
相关产品推荐
相关产品推荐

