Subfinder字幕查找器:3种方式告别观影无字幕困扰
2026/7/31 14:57:44
Jackson 从 1.x 到 2.x 的演进,不仅是一次技术升级,更深刻影响了 Spring 生态(尤其是 Spring MVC 和 Spring Boot)的 JSON 处理方式。下面从Jackson 自身差异、Spring 对 Jackson 的集成变迁、实际开发中的迁移注意事项三个维度,系统梳理这一历程。
| 维度 | Jackson 1.x (org.codehaus.jackson) | Jackson 2.x (com.fasterxml.jackson) |
|---|---|---|
| 包名 | org.codehaus.jackson.* | com.fasterxml.jackson.* |
| 模块化 | 核心 + mapper 混合 | 拆分为core/annotations/databind |
| 注解位置 | org.codehaus.jackson.map.annotate.* | com.fasterxml.jackson.databind.annotation.* |
| 过滤 null | @JsonSerialize(include = Inclusion.NON_NULL) | 废弃→ 改用@JsonInclude(Include.NON_NULL) |
| 异常体系 | JsonProcessingException等 | 更细粒度(JsonParseException,DatabindException) |
| 扩展性 | 基础支持 | 更强(支持自定义Module、AnnotationIntrospector等) |
| 维护状态 | 已停止(~2013) | 活跃维护(当前 2.17+) |
✅关键结论:两者二进制不兼容,不能共存于 classpath(会冲突)。
<dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.13</version></dependency><mvc:annotation-driven/><!-- 自动检测 classpath 下的 Jackson 1.x -->⚠️ 此时若想用 Jackson 2.x,需显式配置
MappingJackson2HttpMessageConverter(名字带 “2” 就是为区分 1.x)。
MappingJackson2HttpMessageConverter(取代旧的MappingJacksonHttpMessageConverter)Jackson2ObjectMapperBuildercom.fasterxml.jackson.databind.ObjectMapper<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 传递依赖 jackson-databind 2.x --></dependency>application.properties轻松配置:spring.jackson.serialization.write-dates-as-timestamps=false spring.jackson.default-property-inclusion=NON_NULL✅从此,新项目几乎不再接触 Jackson 1.x。
Optional,LocalDateTime等开箱即用)。Jackson2ObjectMapperBuilderCustomizer定制:@BeanpublicJackson2ObjectMapperBuilderCustomizerjsonCustomizer(){returnbuilder->builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);}javax.*→jakarta.*com.fasterxml.jackson)importorg.codehaus.jackson.JsonGenerator;importorg.codehaus.jackson.map.JsonSerializer;importorg.codehaus.jackson.map.SerializerProvider;publicclassMySerializerextendsJsonSerializer<MyClass>{@Overridepublicvoidserialize(MyClassvalue,JsonGeneratorjgen,SerializerProviderprovider){jgen.writeString("custom");}}importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.fasterxml.jackson.databind.SerializerProvider;publicclassMySerializerextendsJsonSerializer<MyClass>{@Overridepublicvoidserialize(MyClassvalue,JsonGeneratorgen,SerializerProviderserializers){gen.writeString("custom");}}🔁只需改 import,逻辑几乎不变。
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)privateStringname;@JsonInclude(JsonInclude.Include.NON_NULL)publicclassUser{privateStringname;}// 或字段级@JsonInclude(Include.NON_EMPTY)privateList<String>tags;📌这是最常见的迁移错误!
@BeanpublicMappingJacksonHttpMessageConverterjacksonConverter(){returnnewMappingJacksonHttpMessageConverter();}@BeanpublicMappingJackson2HttpMessageConverterjackson2Converter(){returnnewMappingJackson2HttpMessageConverter();}注意类名多了“2”!
但在 Spring Boot 中,通常无需手动配置,自动装配即可。
若项目同时引入了 Jackson 1.x 和 2.x(例如老 jar 传递依赖),会出现:
ClassNotFoundExceptionNoSuchMethodErrorAbstractMethodError解决方法:
# Maven 查看依赖树mvn dependency:tree|grepjackson# 排除旧版本<exclusion><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId></exclusion>| 时间线 | 技术栈 | 建议 |
|---|---|---|
| 2010–2013 | Spring 3.x + Jackson 1.x | 仅维护旧系统 |
| 2013–2016 | Spring 4.x + Jackson 2.x 过渡期 | 主动迁移,替换包名和注解 |
| 2016 至今 | Spring Boot + Jackson 2.6+ | 使用@JsonInclude,避免include属性 |
| 未来 | Spring Boot 3.x + Jackson 2.15+ | 拥抱 Java 17+,利用新特性(record、sealed class) |
spring-boot-starter-web控制版本。@JsonInclude替代旧的include属性。StdSerializer/StdDeserializer(比直接继承基类更安全)。application.yml,而非硬编码ObjectMapper。如果你正在维护一个从 Spring 3.x 升级到 Spring Boot 的老系统,重点检查:
import org.codehaus.jackson...→ 替换为com.fasterxml.jackson...@JsonSerialize(include=...)→ 改为@JsonInclude(...)这样就能平滑过渡到现代 Jackson 2.x 生态。