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

Une vieille app Spring MVC rend toute la liste d'un coup et une ligne la lit

Objectif Lire les vétérinaires de Spring PetClinic, une app Spring MVC d'avant Spring Boot, sans toucher à son code.

Spring PetClinic tel qu'il était avant Spring Boot: un WAR sur Tomcat. Son contrôleur rend toute la liste d'un coup, sans pages.

manifests/lab-docker-compose.yml
# The clinic's application: Spring PetClinic of before Spring Boot, a WAR on Tomcat 11.name: lumnik-legacy-petclinicservices:  petclinic:    build: ../run/petclinic    ports: ["127.0.0.1:${PETCLINIC_PORT:-9300}:8080"]   # this machine only
manifests/10-vets-xml.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-legacy-petclinic-a  connector_type: rest-generic  scopes: [clinic]spec:  base_url: http://host.docker.internal:9300/petclinic  endpoints:    - id: vets      path: /vets.xml                                   # the address the clinic's team knows      method: GET      pagination: { kind: none, response_path: $.vetList }      target:        kind: hybrid        table: ext.scenario_legacy_petclinic_a        unique_key: $.id        promote:          - { name: first_name, path: $.firstName, type: text }          - { name: last_name, path: $.lastName, type: text }
$ lm source rest probe scenario-legacy-petclinic-a --endpoint /vets.json
# Drafted by lm source rest probe — review before applying
- id: vets-json
  method: GET
  path: /vets.json
  pagination: { kind: none, response_path: $.vetList }   # 6 items, no paging signal in the answer: if the source pages, declare how
  target:
    kind: hybrid
    table: ext.scenario_legacy_petclinic_a_vets_json
    unique_key: $.id
    promote:
      - { name: firstname, path: $.firstName, type: text }
      - { name: id, path: $.id, type: bigint }
      - { name: lastname, path: $.lastName, type: text }
      - { name: new, path: $.new, type: boolean }
      - { name: nrofspecialties, path: $.nrOfSpecialties, type: bigint }
manifests/20-vets-json.yaml
apiVersion: connectors.lumnik.io/v1kind: Connectormetadata:  name: scenario-legacy-petclinic-a  connector_type: rest-generic  scopes: [clinic]spec:  base_url: http://host.docker.internal:9300/petclinic  endpoints:    - id: vets      path: /vets.json                                  # the same controller, its JSON view      method: GET      pagination: { kind: none, response_path: $.vetList }   # the whole list in one answer      target:        kind: hybrid        table: ext.scenario_legacy_petclinic_a        unique_key: $.id        promote:          - { name: first_name, path: $.firstName, type: text }          - { name: last_name, path: $.lastName, type: text }          - { name: specialties, path: $.nrOfSpecialties, type: integer }

Limites

  • Le hub ne lit pas l'XML: ici, la même app rend aussi du JSON.
  • kind: none lit une seule requête: si la source pagine, il faut le déclarer.
  • Les données de démo de PetClinic: 6 vétérinaires.

Clinique · vétérinaires

La clinique tourne sur une vieille app Spring.

Il faut lire ses vétérinaires, chaque nuit.

Spring PetClinic, d'avant Spring Boot

Le problème

L'app a été écrite avant les API modernes.

  • Elle rend de l'XML ou du JSON.
  • Toute la liste d'un coup, sans pages.

Ce qui n'est pas modifié

L'app reste telle quelle.

  • Un WAR sur Tomcat.
  • Spring MVC configuré en XML.

Le premier essai

L'adresse connue rend de l'XML.

  • Le hub lit du JSON.
  • Il refuse en le disant, au lieu de lire 0 ligne.

La sonde

lm source rest probe … --endpoint /vets.json

La sonde trouve la liste.

Elle propose kind: none: aucun signe de pages dans la réponse.

Ce qu'il a fallu écrire

pagination: { kind: none, response_path: $.vetList }

Une ligne.

  • 6 vétérinaires, une requête.
  • Un connecteur de 23 lignes.

La limite

Le hub ne lit pas l'XML.

  • Ici, la même app rend aussi du JSON.
  • Si la source pagine, il faut le déclarer.

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 →