使用LogstashEncoder时出现‘无法获取公共无参构造函数’错误
Spring Boot中LogstashEncoder加载Hibernate5Module时构造函数错误的解决方法
问题场景
在Spring Boot 2.7.2项目中配置net.logstash.logback.encoder.LogstashEncoder输出JSON格式日志时,启动应用出现如下错误:
Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException ... Caused by: java.lang.IllegalStateException: Logback configuration error detected: ERROR in net.logstash.logback.encoder.LogstashEncoder@4f659288 - Error occurred while dynamically loading jackson modules java.util.ServiceConfigurationError: com.fasterxml.jackson.databind.Module: com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module Unable to get public no-arg constructor
已确认Hibernate5Module类存在公共无参构造函数,项目依赖版本:
- Spring Boot: 2.7.2
- Jackson: 2.13.3(Spring Boot管理)
- Logback: 1.2.11(Spring Boot管理)
核心原因
- 依赖版本不匹配:
jackson-datatype-hibernate5版本与Spring Boot管理的Jackson核心版本不一致,导致模块构造函数签名不兼容。 - 初始化时机冲突:日志系统初始化早于Spring容器和Hibernate组件,
Hibernate5Module的无参构造依赖Hibernate内部类,此时这些类尚未加载,反射调用构造函数失败。 - 自动加载模块范围过大:
LogstashEncoder默认通过ServiceLoader加载所有Jackson模块,包含了当前场景不需要的Hibernate模块。
解决方案
方案一:排除不需要的Hibernate Jackson模块
如果项目不需要Hibernate与Jackson的集成支持,直接从JPA依赖中排除jackson-datatype-hibernate5:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-hibernate5</artifactId> </exclusion> </exclusions> </dependency>
方案二:禁用LogstashEncoder自动加载模块,手动指定所需模块
修改logstash.xml配置,关闭自动模块加载,仅添加业务需要的Jackson模块:
<configuration> <appender name="json" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="net.logstash.logback.encoder.LogstashEncoder"> <!-- 禁用自动加载所有Jackson模块 --> <enableJacksonModules>false</enableJacksonModules> <!-- 手动添加业务需要的模块,示例为Java8时间模块 --> <jacksonModules> <module>com.fasterxml.jackson.datatype.jsr310.JavaTimeModule</module> </jacksonModules> <!-- 添加自定义字段 --> <customFields>{"app_name":"your-application-name"}</customFields> </encoder> </appender> <root level="INFO"> <appender-ref ref="json" /> </root> </configuration>
方案三:对齐Jackson与Hibernate模块版本
显式指定jackson-datatype-hibernate5版本与Spring Boot管理的Jackson核心版本完全一致:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-hibernate5</artifactId> <version>2.13.3</version> </dependency>
内容的提问来源于stack exchange,提问作者pconrey
相关产品推荐
相关产品推荐

