Skip to content

feat: add Spring Boot 4 demos (easy-paging 0.5.x line)#39

Merged
jlc488 merged 3 commits into
mainfrom
feat/sb4-demos
May 23, 2026
Merged

feat: add Spring Boot 4 demos (easy-paging 0.5.x line)#39
jlc488 merged 3 commits into
mainfrom
feat/sb4-demos

Conversation

@jlc488
Copy link
Copy Markdown
Contributor

@jlc488 jlc488 commented May 23, 2026

Summary

Adds 4 new SB4 demos alongside the existing 4 SB3 demos. Together they cover both starter release lines:

Demo (new) What it showcases
`easy-paging-sb4-demo` `@AutoPaginate` (H2) — includes the custom envelope advanced section too
`easy-paging-sb4-keyset-demo` `@KeysetPaginate` cursor pagination (H2)
`easy-paging-sb4-postgres-demo` Real PostgreSQL — Docker Compose + Testcontainers
`easy-paging-sb4-reactive-demo` WebFlux + R2DBC + Docker PG

Each is a copy of its SB3 counterpart, retargeted at the v0.5.0 line released by easy-paging-spring-boot-starter#50.

What changed in each SB4 demo vs its SB3 sibling

Area Change
spring-boot Gradle plugin 3.5.3 → 4.0.6
io.spring.dependency-management 1.1.6 → 1.1.7 (SB4 compat)
easy-paging-spring-boot-starter 0.4.0 → 0.5.0
Test starters (modularization) Added `spring-boot-starter-webmvc-test` (MVC) or `spring-boot-starter-webflux-test` (reactive) — `@AutoConfigureMockMvc` / `@AutoConfigureWebTestClient` are no longer in `spring-boot-starter-test`
Testcontainers 2.x Module artifacts renamed (`org.testcontainers:postgresql` → `testcontainers-postgresql`, etc.) + explicit `testcontainers-bom:2.0.5` platform
Test imports — Jackson 3 `com.fasterxml.jackson.databind.` → `tools.jackson.databind.`
Test imports — SB4 modularization `...test.autoconfigure.web.servlet.AutoConfigureMockMvc` → `...webmvc.test.autoconfigure.AutoConfigureMockMvc` (and the WebFlux equivalent moves to `webtestclient.autoconfigure`)
Reactive demo only Dropped `PagingWebFluxConfig` — starter 0.5.0's `ReactiveEasyPagingWebFluxAutoConfiguration` now auto-registers the Pageable / Sort resolvers, so the per-app wiring is no longer needed

Dependabot policy

Restructured `.github/dependabot.yml` into two gradle ecosystem entries:

  • SB3 demos (the existing 4 `easy-paging--demo/` + 5 `ssrf-guard--demo/`): keep the existing `ignore` block that holds Spring majors on the 3.x line.
  • SB4 demos (the 4 new `easy-paging-sb4-*`): no Spring-major hold — Dependabot is free to roll through SB4 patch/minor/major. Only the Gradle wrapper major is still gated.

This means a future SB5 release would land in the SB4 entry's queue as a major bump on a dedicated PR, while 0.4.x demos stay safely on the SB3 line.

Top-level README

Split into three sections, both English and Korean kept symmetric:

  • easy-paging — Spring Boot 4 (`0.5.x`) — recommended, listed first
  • easy-paging — Spring Boot 3 maintenance (`0.4.x`) — still supported
  • ssrf-guard

Each SB4 demo's own README gets a callout linking to its SB3 counterpart for cross-line discoverability (both directions).

CI expectation

The `detect` job should pick up exactly the 4 new `easy-paging-sb4-*-demo/` directories (and the postgres/reactive ones will pull `postgres:16-alpine` for Testcontainers). All other demos should be skipped because nothing else changed.

Test plan

  • CI `detect` job identifies exactly the 4 new SB4 demos as changed
  • All 4 `Build easy-paging-sb4-*-demo` matrix jobs turn green
  • After merge, top-level README on `main` renders three sections cleanly
  • Next Dependabot run: SB4 entries get `sb4` label, SB3 entries get `sb3` label, group bumps land per ecosystem

Adds 4 new SB4 demos alongside the existing 4 SB3 demos. Together
they cover both starter release lines:

  easy-paging-sb4-demo            ← @AutoPaginate (H2)
  easy-paging-sb4-keyset-demo     ← @KeysetPaginate (H2)
  easy-paging-sb4-postgres-demo   ← real PG via Docker + Testcontainers
  easy-paging-sb4-reactive-demo   ← WebFlux + R2DBC + Docker PG

Each is a copy of its SB3 counterpart with these SB4-targeted bumps:

- spring-boot Gradle plugin       3.5.3  → 4.0.6
- io.spring.dependency-management 1.1.6  → 1.1.7
- easy-paging-spring-boot-starter 0.4.0  → 0.5.0 (the new SB4 line)
- spring-boot-starter-test split: add starter-webmvc-test for MVC
  demos, starter-webflux-test for the reactive demo (SB4 modularization
  moved @AutoConfigureMockMvc / @AutoConfigureWebTestClient out of the
  catch-all spring-boot-test-autoconfigure into dedicated starters).
- Testcontainers 2.x renames (postgres / reactive demos):
    org.testcontainers:postgresql  → testcontainers-postgresql
    org.testcontainers:junit-jupiter → testcontainers-junit-jupiter
    org.testcontainers:r2dbc       → testcontainers-r2dbc
  + explicit testcontainers-bom:2.0.5 platform (SB4 BOM only manages
  the core artifact, not modules).
- Jackson 3 imports across test code:
    com.fasterxml.jackson.databind.{ObjectMapper,JsonNode}
      → tools.jackson.databind.{ObjectMapper,JsonNode}
- SB4 modularization test-autoconfigure imports:
    org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
      → org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc
    org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient
      → org.springframework.boot.webtestclient.autoconfigure.AutoConfigureWebTestClient

Plus reactive-specific cleanup: dropped PagingWebFluxConfig, since
starter 0.5.0's ReactiveEasyPagingWebFluxAutoConfiguration now
auto-registers ReactivePageableHandlerMethodArgumentResolver +
ReactiveSortHandlerMethodArgumentResolver. Demos can simply declare
`Pageable pageable` parameters with no per-app wiring — that was a
gap the SB3 line had that SB4 starter 0.5.0 closes.

Dependabot config restructured: split into two gradle ecosystem
entries.

- SB3 demos: keep the existing ignore rules holding Spring majors
  on the 3.x line, so 0.4.x maintenance demos never accidentally
  jump to SB4.
- SB4 demos: NO Spring-major hold (Dependabot is free to roll
  through SB4 patch/minor/major within the SB4 family). Only the
  Gradle wrapper major is still gated for hand verification.

Top-level README split into three sections: "easy-paging — Spring
Boot 4 (0.5.x)" (recommended), "easy-paging — Spring Boot 3
maintenance (0.4.x)" (still supported), and "ssrf-guard". Both
English and Korean READMEs updated symmetrically.

Each new SB4 demo's README gets a callout pointing at its SB3
counterpart, so cross-line discovery works in either direction.
jlc488 added 2 commits May 23, 2026 18:10
…8.14+)

The Spring Boot 4 Gradle plugin enforces 'Gradle 8.x (8.14 or later)
or 9.x'. Our existing demos shipped wrapper 8.10.2 which is fine for
the SB3 line but blocks SB4 plugin from even applying — first PR run
on this branch failed at plugin resolution time with:

  Spring Boot plugin requires Gradle 8.x (8.14 or later) or 9.x.
  The current version is Gradle 8.10.2

Bump just the 4 sb4 demos to 8.14.3 (latest 8.14.x patch). The SB3
demos stay on 8.10.2 — their plugin doesn't require the bump and
changing them would be unrelated noise.
…figs

Jackson 3's SerializationFeature enum no longer has the
WRITE_DATES_AS_TIMESTAMPS constant — datetime handling moved to a
separate DateTimeFeature, and ISO-8601 is the default. The legacy
yml block:

  spring:
    jackson:
      serialization:
        write-dates-as-timestamps: false

…now fails Spring Boot 4 property binding with:

  Failed to bind properties under 'spring.jackson.serialization'
  to Map<tools.jackson.databind.SerializationFeature, Boolean>:
  No enum constant SerializationFeature.write-dates-as-timestamps

Since ISO-8601 is the SB4 default anyway, the block is just deleted
(rather than ported to wherever Jackson 3 surfaces the equivalent
switch). All 4 SB4 demos cleaned to be safe — only keyset actually
had the block, the regex match is a no-op for the others.

Verified locally: easy-paging-sb4-keyset-demo ./gradlew test is now
BUILD SUCCESSFUL.
@jlc488 jlc488 merged commit 9b817b9 into main May 23, 2026
5 checks passed
@jlc488 jlc488 deleted the feat/sb4-demos branch May 23, 2026 09:20
jlc488 added a commit that referenced this pull request May 23, 2026
…DMEs (#55)

Five spots where the README prose lagged behind the actual build.gradle.kts
pin. The build files were correct; the README narrative just got copy-pasted
from the SB3 source demo (or, for ssrf-guard, only half-bumped during the
3.0.1 -> 3.1.0 sweep) and never re-grepped.

SB4 demos (4 files) — "Files of interest" table said the dep is
:easy-paging-spring-boot-starter:0.4.0 but build.gradle.kts pins :0.5.0:

  easy-paging-sb4-demo/README.md           line 76: 0.4.0 -> 0.5.0
  easy-paging-sb4-demo/README.ko.md        line 76: 0.4.0 -> 0.5.0
  easy-paging-sb4-keyset-demo/README.md    line 92: 0.4.0 -> 0.5.0
  easy-paging-sb4-keyset-demo/README.ko.md line 92: 0.4.0 -> 0.5.0

  Root cause: when the four SB4 demos were branched off the SB3 demos in
  PR #39, build.gradle.kts and the README header callout ("Spring Boot 4
  line. ... 0.5.x line") were correctly retargeted to 0.5.0, but the
  detail table at the bottom of the README ("the only dependency the demo
  adds...") was left at 0.4.0. The English ones for postgres/reactive
  don't repeat the version in prose so they were unaffected.

ssrf-guard demo (1 file) — only the Korean README, "Files of interest" row
listed three sub-artifacts but mixed two versions:

  ssrf-guard-demo/README.ko.md line 127:
    :ssrf-guard:3.1.0, :ssrf-guard-resttemplate:3.0.1, :ssrf-guard-webclient:3.0.1
      -> :ssrf-guard:3.1.0, :ssrf-guard-resttemplate:3.1.0, :ssrf-guard-webclient:3.1.0

  Root cause: PR #52 ("ssrf-guard 3.0.1 -> 3.1.0 + langchain4j demo")
  bumped the README header and the meta-artifact mention but only the
  first of the three sub-artifact lines on line 127 of the KO file; the
  English README on line 128 got all three. KO half-update slipped through
  review.

All SB3 demo READMEs that still reference :0.4.0 are intentional - the SB3
demos pin to the 0.4.x maintenance line on purpose. Verified by grep that
no other build.gradle.kts vs README mismatches remain.
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