You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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管理)

核心原因

  1. 依赖版本不匹配:jackson-datatype-hibernate5版本与Spring Boot管理的Jackson核心版本不一致,导致模块构造函数签名不兼容。
  2. 初始化时机冲突:日志系统初始化早于Spring容器和Hibernate组件,Hibernate5Module的无参构造依赖Hibernate内部类,此时这些类尚未加载,反射调用构造函数失败。
  3. 自动加载模块范围过大: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:31:06