L'API REST est du glue code.
Pas besoin de l'écrire.
HexaGlue génère les controllers Spring MVC, DTOs avec validation et documentation OpenAPI depuis vos ports driving. Zéro code manuel pour la couche API REST.
5 types d'artefacts, dérivés de vos ports driving
| Artefact | Quantité typique | Rôle |
|---|---|---|
| Controller | 1 par port driving | @RestController avec @RequestMapping, @Tag OpenAPI et injection du port |
| Request DTO | 1 par méthode avec body | Record Java avec annotations @NotNull, @NotBlank, @Positive de Bean Validation |
| Response DTO | 1 par type de retour | Record Java avec factory from() pour la projection domaine vers REST |
| Exception Handler | 1 global | @RestControllerAdvice avec mappings exception vers code HTTP configurables |
| Configuration | 1 global | @Configuration avec @Bean exposant les services via leurs ports driving |
Le nombre d'artefacts croît linéairement avec le nombre de ports driving. Pour chaque interface de cas d'utilisation ajoutée au domaine, HexaGlue produit un controller complet avec ses DTOs. C'est du code que vous n'avez pas à écrire ni à maintenir.
Des noms de méthode aux verbes HTTP
| Préfixe de méthode | Verbe | Chemin | Statut |
|---|---|---|---|
create, add, register | POST | / | 201 |
get, find, load | GET | /{id} | 200 |
list, getAll, findAll | GET | / | 200 |
update, modify, edit | PUT | /{id} | 200 |
delete, remove, archive | DELETE | /{id} | 204 |
search, query | GET | /search | 200 |
Ces règles sont déterministes : pour un même port driving, HexaGlue produit toujours la même API REST. Les identifiants de type wrapper (comme OrderId(UUID)) sont automatiquement dépliés vers leur type primitif dans les @PathVariable et reconstruits via la factory OrderId.of(uuid).
Votre port vs le code généré
// Votre port driving : un contrat métier, pas une API HTTPpublic interface OrderUseCases { Order createOrder(CustomerId customerId, List<OrderLine> lines); Order getOrder(OrderId id); List<Order> listOrders(); void deleteOrder(OrderId id); Order updateOrder(OrderId id, List<OrderLine> lines);}@RestController@RequestMapping("/api/orders")@Tag(name = "Orders", description = "Order management operations")public class OrderController {
private final OrderUseCases orderUseCases;
public OrderController(OrderUseCases orderUseCases) { this.orderUseCases = orderUseCases; }
@PostMapping @Operation(summary = "Create order") public ResponseEntity<Object> createOrder( @Valid @RequestBody CreateOrderRequest request) { var result = orderUseCases.createOrder( CustomerId.of(request.customerId()), request.lines()); return ResponseEntity.status(201).body(OrderResponse.from(result)); }
@GetMapping("/{id}") @Operation(summary = "Get order") public ResponseEntity<Object> getOrder(@PathVariable UUID id) { var result = orderUseCases.getOrder(OrderId.of(id)); return ResponseEntity.ok(OrderResponse.from(result)); }
@GetMapping @Operation(summary = "List orders") public ResponseEntity<Object> listOrders() { var result = orderUseCases.listOrders(); return ResponseEntity.ok(result.stream() .map(OrderResponse::from).toList()); }
@DeleteMapping("/{id}") @Operation(summary = "Delete order") public ResponseEntity<Void> deleteOrder(@PathVariable UUID id) { orderUseCases.deleteOrder(OrderId.of(id)); return ResponseEntity.noContent().build(); }}// Request DTO : validation automatique depuis les types du domainepublic record CreateOrderRequest( @NotNull UUID customerId, @Valid @NotEmpty List<OrderLineRequest> lines) {}
// Response DTO : factory from() pour la projection domaine → RESTpublic record OrderResponse( UUID id, UUID customerId, String status) { public static OrderResponse from(Order source) { return new OrderResponse( source.getId().value(), source.getCustomerId().value(), source.getStatus().name()); }}Chaque méthode du port driving produit un endpoint REST complet : annotation HTTP, validation des entrées, projection de la réponse et documentation OpenAPI. Ajoutez une méthode au port, le controller se met à jour au prochain build.
Du code généré qui vous appartient
Régénérer à chaque build
Mode par défaut. Les artefacts sont écrits dans target/ et régénérés à chaque mvn compile. Le code généré n'est pas versionné : il reste toujours synchronisé avec vos ports driving.
Committer dans votre code
Redirigez la sortie vers src/main/java via l'option outputDirectory. Le code généré devient partie intégrante de votre projet. Vous pouvez ensuite le modifier, l'enrichir ou désactiver la régénération.
Le plugin génère des controllers Spring MVC standards avec des records Java pour les DTOs. Pas de framework propriétaire, pas de runtime : le code généré fonctionne avec n'importe quelle version de Spring Boot compatible.
Besoin d'une génération sur mesure ?
Ce plugin démontre qu'il est possible de générer automatiquement toute la couche API REST depuis les ports driving. Bien qu'il couvre les patterns les plus courants, il ne prétend pas répondre à toutes les conventions et exigences de chaque entreprise.
Votre métier mérite toute votre attention.
Générez l'API REST au build.
Voyez comment HexaGlue produit des controllers REST complets à partir de ports driving.