Cassini implémente strictement Jakarta RESTful Web Services 4.0. Si votre application est déjà standard (annotations spec, pas d’API propriétaire), la migration consiste essentiellement à changer les coordonnées Maven du runtime. Cette page documente les pièges et les correspondances.

Cassini est en 0.1.0-SNAPSHOT. Une migration de production est prématurée tant que la première release stable n’est pas publiée. Cette page anticipe le chemin pour les utilisateurs qui veulent évaluer.

Depuis Jersey

Jersey Cassini Note

org.glassfish.jersey.server.ResourceConfig

jakarta.ws.rs.core.Application

Spec standard. Jersey-isms (packages(), register(Object)) à remplacer par getClasses() / getSingletons().

org.glassfish.jersey.containers.grizzly2

cassini-chappe (transport de référence) ou cassini-jdk-http

SeBootstrap.start(…​) standard à la place de GrizzlyHttpServerFactory.

HK2 bridge (hk2-cdi-bridge)

cassini-cdi-vauban

Vauban résout l’injection en build-time, pas via HK2.

jersey-mvc, jersey-bean-validation…​

Pas d’extension propriétaire

Cassini reste 100 % spec. Bean Validation à brancher manuellement (TODO post-1.0).

Logging filter LoggingFeature

ContainerRequestFilter + ContainerResponseFilter standard

Implémentation à la main (10 lignes — voir cas d’usage).

// Avant — Jersey + Grizzly
ResourceConfig config = new ResourceConfig().packages("com.example");
GrizzlyHttpServerFactory.createHttpServer(URI.create("http://0.0.0.0:8080/"), config);

// Après — Cassini SE-Bootstrap
SeBootstrap.start(MyApplication.class, SeBootstrap.Configuration.builder()
    .host("0.0.0.0").port(8080).build()).toCompletableFuture().join();

Depuis RESTEasy

RESTEasy Cassini Note

quarkus-resteasy-reactive

cassini-cdi-vauban

Chemin équivalent en build-time, sans Quarkus. Champollion remplace le binding JSON Quarkus.

Vert.x transport

Chappe (cassini-chappe)

Virtual threads natifs, pas d’event-loop. Concurrency model différent — voir fonctionnement interne.

Weld intégré

Vauban (Lite) optionnel

Vauban est CDI 4.1 Lite, pas Full. Vérifier que vous n’utilisez pas de fonctionnalités Full (decorators dynamiques, conversation scope, etc.).

jakarta.ws.rs.client (API Client)

cassini-client

Client JAX-RS 4.0 standard désormais livré (java.net.http + virtual threads). Le MicroProfile Rest Client est fourni séparément via Vidocq (Cyrano).

Filters Pre/Post-matching

Identique Jakarta REST 4.0

Aucun changement.

Depuis Helidon REST

Helidon SE 4 expose une API custom (HttpRouting, Handler). Helidon MP utilise Jersey en dessous — la migration est alors équivalente à "depuis Jersey" ci-dessus.

Pour Helidon SE → Cassini, il faut réécrire vers les annotations JAX-RS standard. Cassini ne prétend pas être un moteur "fluent routing" — c’est un moteur Jakarta REST.

Depuis CXF (JAX-RS)

CXF est très proche de la spec. La migration est essentiellement un changement de coordonnées Maven et un retrait des <jaxrs:server> Spring/Blueprint au profit de SeBootstrap.start(…​).

Bindings JSON — point d’attention

Jersey et RESTEasy délèguent par défaut à Yasson ou Jackson. Cassini délègue à Champollion :

  • Sérialisation statique : ajouter champollion-codegen-apt au build pour les types nouveaux.

  • Annotations standard @JsonbProperty, @JsonbDateFormat, @JsonbTypeAdapter supportées.

  • Annotations Jackson (@JsonProperty, @JsonIgnore…​) non supportées — convertir vers JSON-B.

Annotations Jakarta REST 4.0

Toutes les annotations standards sont préservées. Pas de changement attendu sur le code utilisateur si le code source est strictement spec.

Pièges connus

  • Sub-resources locators (@Path sur méthode retournant une instance) : supportés. Vérifier les imports si l’application utilisait une variante propriétaire.

  • @Suspended AsyncResponse : supporté ; le streaming chunked complet est en jalon M2h (voir TCK).

  • SSE backpressure : CassiniSseEventSink bufférise pour la 0.1.0 — le streaming au fil de l’eau arrive en M2i.

  • Client JAX-RS : un client standard est désormais livré dans cassini-client (ClientBuilder.newClient(), java.net.http + virtual threads). Les entités multipart côté client restent limitées — utiliser un client externe pour ces cas en attendant.

  • MicroProfile Config / Health / Metrics : à brancher via Vidocq Runtime (orchestrateur) — Cassini seul ne configure pas MP.

Voir aussi

  • Concepts

  • État TCK

  • lien:https://codeberg.org/Vidocq/cassini/src/branch/main/cassini-migration.md[Notes de migration internes (repo)]