Meine Bibliothek-Dokumente

Multi-Root-Seitenleiste

flex-layout

  • Getting Started

  • Guides

  • Reference

typed-rx-http

  • Getting Started

  • Guides

  • Reference

global-rx-state

  • Getting Started

  • Guides

  • Reference

webflux-fe-dev-assistant

reactive-mongo-dsl

Übersicht

Erklärt den Hintergrund und die Prinzipien, die die wiederholte Erstellung von API-Verträgen und Typen während der gleichzeitigen Entwicklung von Backend und Frontend beseitigen und die wiederkehrenden Entwicklungsarbeiten wie Router, Handler und MongoDB-Feldstrings durch quellbasierte Generierung ersetzen.


Ursprungsgeschichte

Ich arbeite sowohl an Backend als auch Frontend. Bei der Erstellung einer Funktion musste ich Endpunkte und Request/Response DTOs in Java WebFlux schreiben und dann im Frontend dieselbe URL und TypeScript-Typen erstellen. Um die Swagger-Dokumentation abzugleichen, musste ich bereits vorhandene Informationen im Backend in ein anderes Format übertragen.

Der größte Engpass war der Prozess, bei dem die vom Backend erstellten API-Verträge in eine Form umgeschrieben wurden, die das Frontend verwenden kann. Wenn sich auch nur eines der URL-, HTTP-Methoden-, Pfad-/Abfrageparameter- oder Request/Response-Strukturen auf beiden Seiten unterschiedlich änderte, wurde das Problem erst nach der Kompilierung entdeckt. Es war nicht nur eine lästige Aufgabe, sondern die Inkonsistenzen, die durch die doppelte Verwaltung derselben Informationen durch Menschen entstanden, waren ein größeres Problem.

Ich wollte auch die Wiederholung beim Erstellen von RouterFunction und Handler reduzieren. Wenn ich einen Verweis wie ApiAccountHandler::search zum Router hinzugefügt habe, dachte ich, dass das Skelett einer nicht existierenden Handler-Klasse und -Methode automatisch erstellt werden könnte. Das wiederholte Schreiben von Entity-Feldnamen wie "username" als Strings beim Erstellen von MongoDB-Abfragen war ebenfalls mühsam und fehleranfällig, weshalb ich die Funktion, die die Entity-Quellen liest und in Java-Enums umwandelt, ebenfalls in dasselbe Tool integriert habe.

So wurden zuerst Swagger/OpenAPI-Generierung, Handler-Skelett-Generierung und Mongo-Entity-Feld-Enum-Generierung erstellt, und später wurde die AsyncAPI-Generierung hinzugefügt, während RSocket verwendet wurde. Obwohl sie wie separate Ideen erscheinen, ist der Ausgangspunkt derselbe. Es geht darum, dass Menschen nicht erneut Fakten, die bereits im Backend-Quellcode festgehalten sind, umschreiben und dass Entwicklungswerkzeuge die maschinenlesbaren Teile stattdessen erstellen.

Entwicklungsphilosophie

Es basiert auf dem Backend-Quellcode

RouterFunction, Handler, DTO und Entity verwenden bereits vorhandene Informationen als Original für API-Dokumentation und generierten Code. Der Schlüssel ist, dass dasselbe Vertragsdokument nicht in separaten Dateien verwaltet wird.

Wählen Sie Entwicklungszeitautomatisierung über Laufzeitmagie

Es ist kein Framework, das Produktionsanfragen abfängt, sondern analysiert den Quellcode in der lokalen Entwicklungsumgebung und erstellt tatsächliche Dateien. Die Ergebnisse können visuell überprüft und versioniert werden.

Folgt vorhersehbaren Projektkonventionen

Zielt nicht darauf ab, einen universellen Compiler zu schaffen, der allen Java-Code versteht. Ich priorisiere die Analyse der WebFlux-funktionalen Endpunktstruktur, die ich tatsächlich verwende, nach klaren Regeln.

Eliminiert wiederholte Verbindungsabschnitte

Erstellt Swagger im Backend-Endpunkt und verbindet den Frontend-Generator, der dieses Dokument liest, um Service und Typ in einer automatisierten Kette zu erstellen.

Was wird im Backend gelesen?

RouterFunction-Quellcode

HTTP-Methode, verschachtelter Pfad, Handler-Methodenreferenz und Prädikat lesen.

Handler-Quelle

Anforderungsinhalt, Abfrage/Pfad-Werte und Antwortverleger-Typ lesen.

Request / Response DTO

Verknüpfen Sie den bereits erstellten Java-Typ im Backend mit dem OpenAPI-Schema.

Mongo-Entity-Quelle

Java-Feld und @Field-Speicher-Rohname, @Document-Sammlung lesen.

RSocket-Controller

@MessageMapping-Route und Anforderungs-/Antwortpayload-Typ lesen.

Was wird anstelle von wiederholtem Schreiben erstellt?

swagger.json

REST-Endpunkt als API-Vertrag erstellen, den der Frontend-Service und der TypeScript-Typ-Generator verwenden können.

asyncapi-rsocket.json

RSocket-Route und Payload als Vertrag erstellen, den der Frontend-RSocket-Client-Generator lesen kann.

Handler-Quelle

Basierend auf der zuvor angegebenen Handler-Referenz in RouterFunction die Klassen- und Methodenskelett erstellen und anpassen.

{Entity}Fields-Enum

Erstellen Sie ein Enum für die Java-Felder der Entität und den Speicher-Rohnamen, um die Wiederholung von String-Feldnamen zu vermeiden.

CollectionNames-Enum

Erstellen Sie die Sammlungsnamen, die in @Document deklariert sind, um sie anstelle von Strings verwenden zu können.

Automatisierungsfluss im aktuellen Projekt

RouterFunction, Handler und Java-Anforderungs-/Antwort-DTO im Backend erstellen.

Der Watcher des lokalen Profils erkennt Änderungen an der Quelle und aktualisiert swagger.json oder asyncapi-rsocket.json.

Das Generierungsskript von @byeolnaerim/typed-rx-http liest die Dokumentation und erstellt Servicefunktionen und TypeScript-Typen.

Im Bildschirmcode importieren Sie die generierten Funktionen, ohne die URL und den Antworttyp neu zu schreiben.

Wenn sich die Entität ändert, werden auch das Feld-Enum und das Sammlungs-Enum, die in der Abfrage verwendet werden, aktualisiert.

© 2026 Byeolnaerim. Alle Rechte vorbehalten.EinführungDatenschutzrichtlinie