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
相关产品推荐
相关产品推荐

