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

Java 8升级至17:Jackson与Jakarta依赖迁移报错求助

解决Java 17升级后Jackson注解不生效的JsonbException问题

问题根源

你遇到的JsonbException是因为项目当前使用**Jakarta JSON-B(Jsonb)**作为JSON序列化/反序列化工具,而非你期望的Jackson。Jsonb默认要求实体类有无参构造器,且不识别Jackson的@JsonCreator、@JsonAlias等注解,所以才会报错。

解决方案

要继续使用Jackson注解,需要让项目切换回Jackson作为JSON处理器,并确保依赖适配Jakarta规范:

1. 替换JAXB依赖为Jakarta版本

移除旧的javax.xml.bind.jaxb-api,改用Jakarta官方的JAXB依赖:

<!-- Jakarta JAXB API -->
<dependency>
    <groupId>jakarta.xml.bind</groupId>
    <artifactId>jakarta.xml.bind-api</artifactId>
    <version>4.0.0</version>
</dependency>
<!-- JAXB运行时实现 -->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>4.0.2</version>
    <scope>runtime</scope>
</dependency>

2. 引入Jackson的Jakarta兼容依赖

确保项目引入支持Jakarta规范的Jackson版本(Jackson 2.12+已支持Jakarta),同时排除可能自动引入的Jsonb依赖:

<!-- Jackson核心注解 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.15.2</version>
</dependency>
<!-- Jackson数据绑定核心 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
    <!-- 排除可能引入的Jsonb依赖 -->
    <exclusions>
        <exclusion>
            <groupId>jakarta.json.bind</groupId>
            <artifactId>jakarta.json.bind-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Jackson适配Jakarta JSON API的提供者 -->
<dependency>
    <groupId>com.fasterxml.jackson.jakarta.rs</groupId>
    <artifactId>jackson-jakarta-rs-json-provider</artifactId>
    <version>2.15.2</version>
</dependency>

3. 配置框架优先使用Jackson

如果是Spring/Spring Boot项目,添加配置强制使用Jackson作为JSON处理器:

  • 在application.properties中添加:
# Spring MVC环境
spring.mvc.converters.preferred-json-mapper=jackson
# 若为WebFlux环境则用下面的配置
# spring.webflux.converters.preferred-json-mapper=jackson

4. 确认实体类的Jackson注解用法

确保BolRateLimit类的Jackson注解使用正确,@JsonCreator必须配合@JsonProperty标注构造器参数:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnore;

public class BolRateLimit {
    private final int limit;
    private final int remaining;
    private final String ignoredField;

    @JsonCreator
    public BolRateLimit(
            @JsonProperty("limit") int limit,
            @JsonProperty("remaining") int remaining,
            @JsonProperty("ignored_field") String ignoredField
    ) {
        this.limit = limit;
        this.remaining = remaining;
        this.ignoredField = ignoredField;
    }

    // 给字段添加JSON别名
    @JsonAlias({"rate_limit"})
    public int getLimit() {
        return limit;
    }

    public int getRemaining() {
        return remaining;
    }

    // 忽略该字段的序列化/反序列化
    @JsonIgnore
    public String getIgnoredField() {
        return ignoredField;
    }
}

验证

完成上述配置后,重新运行测试,Jackson会正常识别注解,无需修改实体类的注解为Jsonb版本,同时满足Jakarta规范的要求。

内容的提问来源于stack exchange,提问作者wouterio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:04:55