Wiki source code of Basisprojekt
Version 38.3 by Marco Grawunder on 2025/09/03 10:45
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | [[image:Main.Organisatorisches.WebHome@softwareprojekt_logo_transparent.png||alt="SoftwareprojektLogo.png" data-xwiki-image-style-alignment="end" height="136" width="309"]] | ||
| 2 | |||
| 3 | Hier folgen Erklärungen des neuen Basisprojekts. Es wird um die folgenden Themen gehen: | ||
| 4 | |||
| 5 | {{toc/}} | ||
| 6 | |||
| 7 | |||
| 8 | = Basisprojekt mit IntelliJ einrichten = | ||
| 9 | |||
| 10 | [[image:1755245956916-184.png]] | ||
| 11 | |||
| 12 | == Clone == | ||
| 13 | |||
| 14 | [[image:1755245971657-468.png]] | ||
| 15 | |||
| 16 | |||
| 17 | [[image:1755245980026-164.png]] | ||
| 18 | |||
| 19 | Auf anderen Branch wechseln (hier development) | ||
| 20 | |||
| 21 | [[image:1755245996886-733.png]] | ||
| 22 | |||
| 23 | == Initialer Build (Generierung) == | ||
| 24 | |||
| 25 | [[image:1755246008466-477.png]] | ||
| 26 | |||
| 27 | |||
| 28 | [[image:1755246018789-616.png]] | ||
| 29 | |||
| 30 | |||
| 31 | == Lombok Plugin == | ||
| 32 | |||
| 33 | **Lombok Plugin installiert? Wenn nein jetzt machen** | ||
| 34 | |||
| 35 | [[image:1755248508652-523.png]] | ||
| 36 | |||
| 37 | **Hinweis: Wenn man schon hier ist, kann man auch das Spring-(Boot)-Plugin **installieren | ||
| 38 | |||
| 39 | [[image:1756886220468-891.png]] | ||
| 40 | |||
| 41 | == Server laufen lassen == | ||
| 42 | |||
| 43 | [[image:1755246035428-328.png]] | ||
| 44 | |||
| 45 | |||
| 46 | ... und ggf. Lombok aktivieren (Man wird nach dem Start der Anwendung gefragt) | ||
| 47 | |||
| 48 | [[image:1755246072443-191.png]] | ||
| 49 | |||
| 50 | |||
| 51 | [[image:1755246118807-452.png]] | ||
| 52 | |||
| 53 | |||
| 54 | == Logging umstellen == | ||
| 55 | |||
| 56 | [[image:1755246135109-325.png]] | ||
| 57 | |||
| 58 | |||
| 59 | [[image:1755246147827-679.png]] | ||
| 60 | |||
| 61 | |||
| 62 | [[image:1755246162330-595.png]] | ||
| 63 | |||
| 64 | == Development Profil aktivieren == | ||
| 65 | |||
| 66 | damit dann user1 - user9 angelegt werden und man nicht jedesmal neu registrieren muss | ||
| 67 | |||
| 68 | [[image:1755246173415-934.png]] | ||
| 69 | |||
| 70 | |||
| 71 | **Wenn man IntelliJ nicht in der Pro-Version verwendet bzw. das Spring Boot Plugin nicht installiert hat, muss kann man ein Spring-Profil über eine Umgebungsvariable in der Konfiguration des Servers setzen: ** | ||
| 72 | |||
| 73 | **SPRING_PROFILES_ACTIVE=dev** | ||
| 74 | |||
| 75 | [[image:1755248752596-839.png]] | ||
| 76 | |||
| 77 | |||
| 78 | == Client starten == | ||
| 79 | |||
| 80 | [[image:1755246257400-525.png]] | ||
| 81 | |||
| 82 | |||
| 83 | [[image:1755246212916-883.png]] | ||
| 84 | |||
| 85 | |||
| 86 | [[image:1755246223246-834.png]] | ||
| 87 | |||
| 88 | |||
| 89 | === Mehrere Instanzen des Clients ermöglichen === | ||
| 90 | |||
| 91 | [[image:1755246233218-893.png]] | ||
| 92 | |||
| 93 | |||
| 94 | Wenn folgendes kommt, ist entweder das "dev" Profil nicht aktiviert, der Nutzer wurde nicht angelegt. Wenn der Server nicht läuft, gibt es eine andere Fehlermeldung. | ||
| 95 | |||
| 96 | [[image:1755246292057-581.png]] | ||
| 97 | |||
| 98 | |||
| 99 | = Kurzer Blick ins Basisprojekt = | ||
| 100 | |||
| 101 | [[image:1755249096987-249.png]] | ||
| 102 | |||
| 103 | |||
| 104 | [[image:1755249136156-419.png]] | ||
| 105 | |||
| 106 | |||
| 107 | == Screenshots == | ||
| 108 | |||
| 109 | [[image:1755249228556-469.png]] | ||
| 110 | |||
| 111 | |||
| 112 | = Kommunikation Client ~-~-> Server = | ||
| 113 | |||
| 114 | [[image:1755249285866-367.png]] | ||
| 115 | |||
| 116 | Der Server verwendet das REST-Protokoll und als Austauschformat JSON | ||
| 117 | |||
| 118 | = OpenAPI = | ||
| 119 | |||
| 120 | (Hinweis: Ich bin nicht sicher, ob IntelliJ diese Darstellung auch hat, wenn man nicht die Ultimate Version verwendet. Ggf. muss man das OpenAPI-Plugin installieren) | ||
| 121 | |||
| 122 | [[image:1755250026156-269.png]] | ||
| 123 | |||
| 124 | [[image:1755250050031-304.png]] | ||
| 125 | |||
| 126 | * **Paths**: Endpunkte der API (z.B. /users, /lobbies). | ||
| 127 | * **Operations**: Spezifikation von Methoden wie GET, POST. | ||
| 128 | * **Definitions**: Detaillierte Beschreibung von Eingabe- und Ausgabestrukturen. | ||
| 129 | * **Security**: Authentifizierungsmechanismen. | ||
| 130 | |||
| 131 | [[image:1755250061990-172.png]] | ||
| 132 | |||
| 133 | Kann JSON oder YAML (Yet Another Markup Language) verwenden YAML ist wie JSON nur mit weniger Klammern | ||
| 134 | |||
| 135 | [[image:1755250157536-746.png]] | ||
| 136 | |||
| 137 | Die aktuelle Version des OpenAPI Dokumentes findet sich im Basisprojekt 2 [[https:~~/~~/gitlab.swl.informatik.uni-oldenburg.de/SPB/SWPBasisprojekt2/-/blob/master/openapi.yaml?ref_type=heads>>https://gitlab.swl.informatik.uni-oldenburg.de/SPB/SWPBasisprojekt2/-/blob/master/openapi.yaml?ref_type=heads]] | ||
| 138 | |||
| 139 | Dort wird die Datei auch grafisch dargestellt. | ||
| 140 | |||
| 141 | |||
| 142 | = Maven und OpenAPI = | ||
| 143 | |||
| 144 | Die OpenAPI Datei kann verwendet werden, um sich die [[REST-Schnittstellen>>doc:||anchor="HErweiterungderREST-Schnittstelle"]] generieren zu lassen. Diese Erzeugung erfolgt mit dem OpenAPI Generator [[https:~~/~~/github.com/OpenAPITools/openapi-generator>>https://github.com/OpenAPITools/openapi-generator]] | ||
| 145 | |||
| 146 | Man kann dabei jetzt einen Kommandozeilenaufruf verwenden oder man setzt auf das im Basisprojekt vorhandene MVN () | ||
| 147 | |||
| 148 | Dafür ist in den Maven-Dateien bereits das OpenAPI Generator Plugin integriert. Da im Client und im Server unterschiedliche Arten verwendet werden, erfolgt die Konfiguration im Client und im Server unterschiedlich: | ||
| 149 | |||
| 150 | == Client == | ||
| 151 | |||
| 152 | Im Client werden die Apache Http Bibliothek verwendet. | ||
| 153 | |||
| 154 | |||
| 155 | [[image:1756887005209-855.png]] | ||
| 156 | |||
| 157 | == Server == | ||
| 158 | |||
| 159 | Im Server wird Spring (Boot) verwendet | ||
| 160 | |||
| 161 | [[image:1756887037619-847.png]] | ||
| 162 | |||
| 163 | TODO: Weitere Informationen zu | ||
| 164 | |||
| 165 | - Lombok | ||
| 166 | |||
| 167 | - Dependency Injection | ||
| 168 | |||
| 169 | - Spring (Boot), siehe auch [[https:~~/~~/www.marcobehler.com/guides/spring-framework>>https://www.marcobehler.com/guides/spring-framework]] | ||
| 170 | |||
| 171 | |||
| 172 | |||
| 173 | = Erweiterung der REST-Schnittstelle = | ||
| 174 | |||
| 175 | In diesem Beispiel wird einmal gezeigt, wie die REST-Schnittstelle des Basisprojektes einfach erweitert werden kann. | ||
| 176 | |||
| 177 | In diesem Beispiel soll die aktuelle Schnittstelle um die Möglichkeit erweitert werden, alle Lobbies vom Server zu bekommen. | ||
| 178 | |||
| 179 | == Schritt 1: Erweitere das OpenAPI-Dokument == | ||
| 180 | |||
| 181 | Um diese neue Funktion sowohl im Client als auch im Server verwenden zu können, ist es notwendig, diese neue Funktion im OpenAPI-Dokument zu definieren. | ||
| 182 | |||
| 183 | Die Funktion soll sehr einfach sein und keine Parameter verlangen. Dafür bietet sich die GET-Funktion an. | ||
| 184 | |||
| 185 | Im folgenden Bild sind alle Anpassungen zu sehen: | ||
| 186 | |||
| 187 | [[image:1756887436525-790.png||height="355" width="974"]] | ||
| 188 | |||
| 189 | |||
| 190 | Nach dem Speichern, sollte das OpenAPI-Dokument wie folgt aussehen | ||
| 191 | |||
| 192 | [[image:1756887488020-376.png||height="642" width="904"]] | ||
| 193 | |||
| 194 | |||
| 195 | Jetzt kann man entweder in IntelliJ | ||
| 196 | |||
| 197 | [[image:1756888245896-845.png||height="347" width="620"]] | ||
| 198 | |||
| 199 | oder im Terminal (z.B. auch in IntelliJ) | ||
| 200 | |||
| 201 | [[image:1756888279902-777.png||height="637" width="1053"]] | ||
| 202 | |||
| 203 | Wobei hier auch clean compile reichen würde. | ||
| 204 | |||
| 205 | **ACHTUNG! Falls maven Problem macht, kann das auch an einer falschen Java-Version im System liegen (siehe auch [[FAQ>>doc:.Basisprojekt FAQ.WebHome]])** | ||
| 206 | |||
| 207 | Es werden durch den Aufruf neue Inhalte generiert (bzw. die alten überschrieben). | ||
| 208 | |||
| 209 | [[image:1756888428042-802.png||height="538" width="1077"]] | ||
| 210 | |||
| 211 | Hinweis: Niemals Änderungen unterhalb des target-Ordners machen. Das wird von Maven bei clean gelöscht. | ||
| 212 | |||
| 213 | === Wie bekommt man dann aber nun die Funktionalität rein? === | ||
| 214 | |||
| 215 | Für jeden Endpunkt (also aktuell lobbies und users) werden drei Interfaces/Klassen erzeugt: | ||
| 216 | |||
| 217 | * *Api (z.B, LobbiesApi): Beschreibung der REST-Methoden, vor allem auch das Mapping von z.B. /lobbies/join auf die Methode lobbyJoin(String) | ||
| 218 | * ((( | ||
| 219 | *ApiController implements *Api (Für Spring) (z.B. LobbiesApiController) | ||
| 220 | ))) | ||
| 221 | * ((( | ||
| 222 | *ApiDelegate (z.B. LobbiesApiDelegate): Macht die eigentliche Arbeit und muss** im eigenen Code-Bereich** erweitert werden! | ||
| 223 | ))) | ||
| 224 | |||
| 225 | |||
| 226 | |||
| 227 | == Schritt 2: Erweiterung auf Server-Seite == | ||
| 228 | |||
| 229 | Da es schon Funktionen für die Lobbies gibt, gibt es auch bereits eine Implementierung, die LobbiesApiDelegate überschreibt | ||
| 230 | |||
| 231 | [[image:1756888762381-912.png||height="48" width="789"]] | ||
| 232 | |||
| 233 | Wenn man einen neuen Endpunkt definiert, muss man auch einen neuen Service definieren. (Hinweis: Der Service muss eine Spring Komponenten sein, damit sie in den Spring Context aufgenommen wird). | ||
| 234 | |||
| 235 | In der Klasse muss man dann die neue Methode lobbyList aus der API überschreiben. | ||
| 236 | |||
| 237 | [[image:1756888929507-312.png||height="156" width="1161"]] | ||
| 238 | |||
| 239 | Dabei wird folgendes gemacht: | ||
| 240 | |||
| 241 | 1. Es wird ein Rückgabeobjekt vom Typ Liste erzeugt | ||
| 242 | 1. Es wird über alles Lobbies auf dem Server gegangen (lobbyManagement.getLobbies()) | ||
| 243 | 1. Da der Client u.U. nicht die vollständigen Informationen über die Lobbies bekommen soll, gibt es zwei unterschiedliche Klassen: ServerLobby und LobbyDTO. | ||
| 244 | 1. Die Foreach-Schleife sorgt dafür, dass in das Rückgabeobjekt nur die LobbyDTOs eingefügt werden. | ||
| 245 | 1. Dafür wird eine Funktion mit dem Namen lobbyMapping verwendet | ||
| 246 | 1. Schließlich wird am Ende gesagt, dass alles ok ist und eine Antwort ResponseEntity.ok mit dem Rückgabeobjekt (lobbies) gesendet. | ||
| 247 | |||
| 248 |