Quarkus服务启动时打印类加载顺序及ObjectMapper配置冲突排查
解决Quarkus中ObjectMapper配置被覆盖及类加载顺序排查问题
一、排查FAIL_ON_UNKNOWN_PROPERTIES被覆盖的方法
- 检查Quarkus全局配置:先看项目的
application.properties或application.yaml,是否存在quarkus.jackson.deserialization.fail-on-unknown-properties=true这类配置——Quarkus的全局配置优先级高于Jar包内的自定义ObjectMapper配置。 - 断点调试+配置溯源:在服务启动流程中,找到ObjectMapper实例初始化的位置(比如注入ObjectMapper的地方)打个断点,查看实例的
_deserializationConfig属性,追踪配置被修改的调用栈;也可以在代码中直接打印配置:@Inject ObjectMapper objectMapper; void init(@Observes StartupEvent event) { boolean failOnUnknown = objectMapper.getDeserializationConfig() .isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); System.out.println("当前FAIL_ON_UNKNOWN_PROPERTIES值: " + failOnUnknown); } - 扫描依赖中的Jackson自定义类:用Quarkus命令
./mvnw quarkus:dependency-tree(Maven)或./gradlew dependencies(Gradle)导出完整依赖树,搜索依赖中是否存在Jackson2ObjectMapperBuilderCustomizer、ObjectMapperCustomizer或自定义的ObjectMapper Bean实现——这些类会在Quarkus启动时覆盖默认配置。 - 利用Quarkus Dev UI:开发模式下启动服务,访问
http://localhost:8080/q/dev,找到Jackson配置面板,里面会列出所有生效的Jackson配置项及其来源,能快速定位覆盖源。
二、打印/记录Jar包类加载顺序的方法
- JVM verbose参数:启动服务时添加JVM参数
-verbose:class,控制台会输出每个类的加载信息,格式类似[Loaded com.fasterxml.jackson.databind.ObjectMapper from jar:file:/path/to/jackson-databind-x.x.x.jar!/],可将输出重定向到日志文件分析:java -jar your-quarkus-app-runner.jar -verbose:class > class-loading.log 2>&1 - Quarkus类加载日志:在
application.properties中添加以下配置,开启类加载器的DEBUG日志,会详细记录Quarkus类加载器加载每个类的来源Jar:quarkus.log.category."io.quarkus.classloading".level=DEBUG - 自定义类加载追踪:如果需要更灵活的记录方式,可借助Java Instrumentation API编写代理拦截类加载事件;或者在Quarkus中注册
BeanPostProcessor,针对性记录特定类(比如Jackson相关类)的加载来源。
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

