lumnik. / scénarios Tous les scénarios · English

Spring change le JSON de ses pages et une ligne suit

Objectif Lire tout le catalogue d'une app Spring Boot, page après page, avant et après que l'équipe change la sérialisation de ses Page.

Un contrôleur Spring renvoie le Page du repository. lumnik le lit avec un preset:

manifests/lab-docker-compose.yml
# A hand-written Spring Boot 3.4 controller returning the repository's Page. PAGE_SERIALIZATION# is the team's choice: direct (Spring's default, with its warning) or via-dto (what that warning recommends).name: lumnik-spring-catalogservices:  catalog:    build: ../run/catalog-app    environment:      PAGE_SERIALIZATION: ${PAGE_SERIALIZATION:-direct}    ports: ["127.0.0.1:${CATALOG_PORT:-9280}:8080"]   # this machine only
manifests/10-articles.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-spring-page-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9280/api  endpoints:    - id: articles      path: /articles      method: GET      pagination: { kind: spring-page, size: 50 }      # a Spring Data Page, serialized as is      target:        kind: hybrid        table: ext.scenario_spring_page_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: family, path: $.family, type: text }          - { name: price_cents, path: $.priceCents, type: integer }
$ lm apply -f manifests/10-articles.yaml
Applied connector "scenario-spring-page-a" — 1 endpoint

$ lm connector run scenario-spring-page-a
run scheduled: ecd4bc8c-db12-4ae0-b7ae-8aa8e4486580

$ lm run get ecd4bc8c-db12-4ae0-b7ae-8aa8e4486580
ID        CONNECTOR               ENDPOINT  STATUS     IN   OUT  SKIPPED  DEAD-LETTERS  STARTED           ENDED             EVALUATED
ecd4bc8c  scenario-spring-page-a  articles  Completed  130  130  0        0             2026-10-30 23:25  2026-10-30 23:25  yes
manifests/20-articles-paged-model.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-spring-page-a  connector_type: rest-generic  scopes: [catalogue]spec:  base_url: http://host.docker.internal:9280/api  endpoints:    - id: articles      path: /articles      method: GET      pagination: { kind: spring-paged-model, size: 50 }   # the same Page under VIA_DTO: PagedModel      target:        kind: hybrid        table: ext.scenario_spring_page_a        unique_key: $.ref        promote:          - { name: label, path: $.label, type: text }          - { name: family, path: $.family, type: text }          - { name: price_cents, path: $.priceCents, type: integer }

Limites

  • Une app de lab, écrite pour le scénario avec les classes de Spring; pas un produit publié.
  • Sous VIA_DTO, spring-page ne perd rien: le coût est une requête vide, et un preset qui ne correspond plus.
  • Articles synthétiques.

Catalogue · articles

Le catalogue est dans une app Spring Boot.

Il faut lire tous les articles, chaque nuit.

Spring Boot 3.4, une app de lab

Le problème

L'app rend ses articles par pages.

  • Chaque page dit combien il y en a.
  • Un jour, l'équipe change la forme de cette réponse.

Ce qui n'est pas modifié

Le code de l'app reste le sien.

  • Le contrôleur renvoie le Page de Spring.
  • Le choix de sérialisation est celui de l'équipe.

Ce qu'il a fallu écrire

pagination: { kind: spring-page }

On nomme le framework.

Un connecteur de 23 lignes: 130 articles, 3 requêtes.

Le changement

L'équipe suit l'avertissement de Spring.

  • Le total passe sous page.
  • Le hub lit tout, avec une page vide de trop.

La correction

pagination: { kind: spring-paged-model }

Une ligne change.

  • De nouveau 3 requêtes.
  • 130 articles, une ligne chacun.

La limite

Une app de lab, pas un produit publié.

  • Écrite avec les classes de Spring.
  • Sans le bon preset, rien n'est perdu: une requête de trop.

Essayer

Le scénario se rejoue en local.

Chaque étape est publiée avec sa sortie.

Ce scénario tourne sur lumnik Open, gratuit et open source.

Essayer lumnik Open →