Jackson 3 Breaks Everything: New Package, Immutable Mapper, and a Mandatory JDK 17 Floor
Nearly every Java service that speaks JSON sits on Jackson. Upgrading to Spring Boot 4 forces this migration, and the breaking changes — new imports, locked configuration, different date formats — will hit every serialization path in a codebase at once.
Jackson 3.0, the first major version in eight years, is a hard break from the 2.x line. The Maven groupId and Java package shift from `com.fasterxml.jackson` to `tools.jackson`, while the annotation package stays put so Jackson 2 and 3 can coexist in the same project. The mutable `ObjectMapper` is replaced by an immutable `JsonMapper` built through a locked Builder pattern, and the entire exception hierarchy switches from checked to unchecked exceptions.
Default behaviors that will silently change API contracts include date serialization moving from timestamps to ISO-8601 strings, primitive null fields throwing exceptions instead of defaulting to zero, and month indexing flipping from 0-based to 1-based. Three previously separate Java 8 support modules are now baked into `jackson-databind`.
Spring Boot 4 ships with Jackson 3 as the default JSON library and manages both Jackson 2 and 3 dependencies to allow gradual migration. The first LTS release will be Jackson 3.1; the 3.0 GA is a transitional version that still demands a JDK 17 baseline.
Keeping the annotation package under the old `com.fasterxml.jackson` namespace while moving core code to `tools.jackson` is a deliberate coexistence hack — it lets libraries compiled against Jackson 2 annotations still work at runtime alongside Jackson 3.
Making `ObjectMapper` immutable via a Builder is less about API fashion and more about eliminating a real class of production bugs where shared mappers were reconfigured mid-flight in multi-threaded services.
Switching from checked to unchecked exceptions aligns Jackson with the broader Java ecosystem trend (Spring, Lombok) but removes a compiler-enforced reminder to handle malformed JSON, pushing that responsibility onto runtime discipline.
The default date format change from timestamps to ISO-8601 strings is the kind of breaking change that won't fail any tests if your test fixtures were also generated by Jackson 2.x — it will only surface in integration with external clients.