Skip to content

feat(kotlin)!: generate against Jackson 3 and Spring Boot 4 - #25

Merged
ExtraToast merged 1 commit into
mainfrom
feat/jackson3
Sep 2, 2026
Merged

feat(kotlin)!: generate against Jackson 3 and Spring Boot 4#25
ExtraToast merged 1 commit into
mainfrom
feat/jackson3

Conversation

@ExtraToast

Copy link
Copy Markdown
Contributor

Aligns the client with its primary consumer. ESA-Blueshell/website runs Spring Boot 4 with Jackson 3 and a shared tools.jackson JsonMapper bean; this client was generated for Spring Boot 3 and Jackson 2, so consuming it there meant two Jackson majors on the classpath and no way to pass the application's own mapper in.

openapi-generator supports Jackson 3 for kotlin/jvm-spring-restclient behind useJackson3 + useSpringBoot4.

This also removes a real bug. Under Jackson 2 the generated constructor appended its converter, so Spring's default JSON converter stayed in front and the NON_ABSENT mapper never ran — every request carried an explicit null for each unset field, which on a Discord PATCH means clear this field. Under Jackson 3 the generated constructor uses configureMessageConverters { registerDefaults().withJsonConverter(..) }, which replaces it properly, so the hand-written factory now mirrors the generated setup rather than working around it.

Annotations stay on com.fasterxml.jackson.annotation with the version managed by the Jackson 3 BOM — pinning it by hand broke the first attempt, since the BOM at 3.1.0 wants annotations 2.x and 2.22.2 was never published.

⚠️ BREAKING: requires Spring 7 / Spring Boot 4 and Jackson 3.

The Brevo client was generated with useSpringBoot3/Jackson 2 while its primary
consumer, ESA-Blueshell/website, runs Spring Boot 4 with Jackson 3 and a shared
tools.jackson JsonMapper bean. Consuming this client there meant carrying two
Jackson majors on the classpath and being unable to hand it the application's
own mapper.

openapi-generator supports Jackson 3 for the kotlin jvm-spring-restclient
library behind useJackson3 + useSpringBoot4, so the generated Serializer now
builds a tools.jackson JsonMapper and the generated constructor wires it with
configureMessageConverters { registerDefaults().withJsonConverter(..) }.

That last detail removes a real bug rather than just moving a version. Under
Jackson 2 the generated constructor appended its converter, so Spring's own
default JSON converter stayed in front and the NON_ABSENT mapper never ran --
every request carried an explicit null for each unset field, which on a Discord
PATCH means "clear this field". The hand-written factory now mirrors the
generated setup instead of working around it.

Annotations stay on the com.fasterxml.jackson.annotation coordinate, where
Jackson 3 left them, with the version managed by the Jackson 3 BOM. Pinning it
by hand is what broke the first attempt: the BOM at 3.1.0 wants annotations
2.x, and 2.22.2 was never published.

BREAKING CHANGE: the client now requires Spring 7 / Spring Boot 4 and Jackson 3
(tools.jackson). Consumers on Spring Boot 3 or Jackson 2 must stay on the
previous release.
@ExtraToast
ExtraToast merged commit db41203 into main Sep 2, 2026
3 checks passed
@ExtraToast
ExtraToast deleted the feat/jackson3 branch September 2, 2026 21:47
@github-actions github-actions Bot mentioned this pull request Sep 2, 2026
github-actions Bot added a commit that referenced this pull request Sep 2, 2026
🤖 I have created a release *beep* *boop*
---


<details><summary>1.0.0</summary>

##
[1.0.0](v0.2.4...v1.0.0)
(2026-09-02)


### ⚠ BREAKING CHANGES

* **kotlin:** generate against Jackson 3 and Spring Boot 4
([#25](#25))

### Features

* generated Brevo clients with spec-derived versioning
([fb81701](fb81701))
* **kotlin:** generate against Jackson 3 and Spring Boot 4
([#25](#25))
([db41203](db41203))


### Bug Fixes

* **ci:** pin release-please-action to v4, releases are broken on v5
([#20](#20))
([5495f38](5495f38))
* **ci:** stop creating workflow runs that cannot execute, and verify
releases properly
([#18](#18))
([f28d49d](f28d49d))
* **ci:** take the release pull request number from release-please
([#14](#14))
([5902f9f](5902f9f))
* **deps:** raise axios, yaml and js-yaml above known advisories
([fc2537b](fc2537b))


### Documentation

* describe the unattended release chain and its one gap
([#12](#12))
([fdf4e58](fdf4e58))


### Build and Dependencies

* **deps-dev:** bump @types/node from 24.9.2 to 26.3.0 in /typescript
([#6](#6))
([6e0c7d8](6e0c7d8))
* **deps-dev:** bump typescript from 5.9.3 to 6.0.3 in /typescript
([#19](#19))
([e62663f](e62663f))
* **deps:** bump actions/checkout from 5.0.0 to 7.0.1
([#9](#9))
([fc41142](fc41142))
* **deps:** bump actions/dependency-review-action from 4.7.2 to 5.0.0
([#11](#11))
([ee9474a](ee9474a))
* **deps:** bump actions/setup-node from 6.0.0 to 7.0.0
([#10](#10))
([7a06984](7a06984))
* **deps:** bump actions/upload-artifact from 4.6.2 to 7.0.1
([#21](#21))
([859cd79](859cd79))
* **deps:** bump googleapis/release-please-action from 4.2.0 to 5.0.0
([#8](#8))
([ea8555b](ea8555b))
* **deps:** bump gradle/actions/setup-gradle from 4.4.1 to 6.3.0
([#22](#22))
([376e7d5](376e7d5))
* **deps:** bump the actions group with 4 updates
([#7](#7))
([3d6fefc](3d6fefc))
* **deps:** Bump the gradle group in /kotlin with 5 updates
([#2](#2))
([3a408dc](3a408dc))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant