Wiki source code of Basisprojekt

Version 61.1 by mgrawunder on 2025/10/16 11:54

Hide last authors
Marco Grawunder 2.1 1 [[image:Main.Organisatorisches.WebHome@softwareprojekt_logo_transparent.png||alt="SoftwareprojektLogo.png" data-xwiki-image-style-alignment="end" height="136" width="309"]]
2
Marco Grawunder 28.1 3 Hier folgen Erklärungen des neuen Basisprojekts. Es wird um die folgenden Themen gehen:
4
Marco Grawunder 24.1 5 {{toc/}}
Marco Grawunder 23.2 6
Marco Grawunder 2.2 7
Marco Grawunder 7.2 8 = Basisprojekt mit IntelliJ einrichten =
9
10 [[image:1755245956916-184.png]]
11
Marco Grawunder 24.2 12 == Clone ==
Marco Grawunder 7.2 13
mgrawunder 60.1 14 Achtung! In dem Screenshot wird das globale Basisprojekt verwendet. Für jede Gruppe existiert bereits ein eigenes Repository, welches verwendet werden sollte,
mgrawunder 52.2 15
mgrawunder 60.1 16 Sie finden die Clone-URL wie folgt:
17
18 * Loggen Sie sich auf [[https:~~/~~/gitlab.swl.informatik.uni-oldenburg.de/>>https://gitlab.swl.informatik.uni-oldenburg.de/]] ein
19 * Falls nicht vorausgewählt, wählen Sie auf der linken Seite "Projects"
20 [[image:1757398628416-879.png||height="119" width="541"]]
21 * Da Sie bisher noch nichts gemacht haben, ist diese Seite leer. Wechseln Sie auf den Reiter Member
22 * Dort sollte ihr Repository zu finden sein.
23 * Oben rechts gibt es einen Button Code. Kopieren Sie dort die URL, die hinter "Clone with HTTPS" steht.
24 [[image:1757398731084-704.png||height="454" width="323"]]
25
Marco Grawunder 7.2 26 [[image:1755245971657-468.png]]
27
mgrawunder 60.1 28 == Access Token ==
Marco Grawunder 7.2 29
mgrawunder 60.1 30 Beim ersten Mal clonen müssen Sie Ihre Gitlab-Zugangsdaten verwenden. Statt Name und Passwort ist es sinnvoll, einen Access-Token zu definieren. Das können Sie machen, in dem Sie auf ihre Profilbild klicken (auf der linken Seite) und dort "Edit Profile" auswählen. In dem nun folgenden Menü gibt es den Punkt Access tokens.
mgrawunder 52.2 31
mgrawunder 60.1 32 [[image:1757398899497-714.png||height="246" width="278"]]
33
34 Dort können Sie mit [[image:1757398947128-748.png||height="89" width="197"]] ein neues Token anlegen.
35
36 Als Namen können Sie z.B. IntelliJ verwenden. Wichtig! Das Token ist aus Sicherheitsgründen nur eine bestimmte Zeit gültig. In diesem Gitlab kann dies maximal ein Jahr sein, standardmäßig ist ist hier aber ein Monat gewählt. Sie sollten also das Feld anpassen.
37
38 [[image:1757399088336-273.png||height="92" width="547"]]
39
40 Bei den Scopes sollten die beiden Rechte "read_repository" und "write_repository" gewählt werden.
41
42 Danach wird das Access Token generiert
43
44 [[image:1757399184270-348.png||height="99" width="978"]]
45
46 Jetzt ist es wichtig, dass Sie sich das Token sichern!
47
mgrawunder 60.2 48 Beim Einloggen in IntelliJ können Sie dieses Token im Passwort-Feld verwenden. Geben Sie ihren Account bei Name ein.
mgrawunder 60.1 49
mgrawunder 61.1 50 Achtung! Gemeint ist hier, wenn Intellij (bzw. git) nach den Account-Daten beim Clonen fragt. Man kann auch einen Gitlab-Account hinterlegen (der dann aber parallel existiert). Hier für ist es wichtig, dass noch "api" und "read_user" als Recht vergeben wird.
mgrawunder 60.2 51
mgrawunder 60.1 52 == Nach dem Clonen ==
53
54 sollten Sie einen Bildschirm ähnlich zu dem folgenden sehen:
55
Marco Grawunder 7.2 56 [[image:1755245980026-164.png]]
57
mgrawunder 60.1 58 Auf dem main-Branch (master) kann keine Änderung gemacht werden, deswegen muss auf einen anderen Branch gewechselt werden. Im Beispiel development.
Marco Grawunder 7.2 59
60 [[image:1755245996886-733.png]]
61
Marco Grawunder 24.2 62 == Initialer Build (Generierung) ==
Marco Grawunder 7.2 63
mgrawunder 60.1 64 Dem neuen Code fehlen einige generierte Dateien. Diese werden wie folgt erzeugt. 
65 Hinweis: Immer, wenn an dem OpenAPI-Dokument etwas geändert wird oder neue Abhängigkeiten für Maven definiert werden, muss diese Aktion durchgeführt werden.
66
Marco Grawunder 10.2 67 [[image:1755246008466-477.png]]
Marco Grawunder 7.2 68
69
Marco Grawunder 10.2 70 [[image:1755246018789-616.png]]
71
72
Marco Grawunder 24.2 73 == Lombok Plugin ==
74
Marco Grawunder 23.1 75 **Lombok Plugin installiert? Wenn nein jetzt machen**
76
Marco Grawunder 25.2 77 [[image:1755248508652-523.png]]
Marco Grawunder 24.2 78
mgrawunder 37.2 79 **Hinweis: Wenn man schon hier ist, kann man auch das Spring-(Boot)-Plugin **installieren
Marco Grawunder 23.1 80
mgrawunder 37.2 81 [[image:1756886220468-891.png]]
mgrawunder 36.2 82
Marco Grawunder 25.2 83 == Server laufen lassen ==
Marco Grawunder 23.1 84
mgrawunder 60.1 85 Den Serverbereich aufklappen und dort auf die Datei ServerApp mit der rechten Maustaste klicken.
86
Marco Grawunder 10.2 87 [[image:1755246035428-328.png]]
88
89
mgrawunder 60.1 90 ... und ggf. Lombok aktivieren (Man wird nach dem Start der Anwendung gefragt). WICHTIG! Wenn das Lombok-Plugin nicht installiert und die folgende Funktion nicht aktiviert ist, muss jede Änderung mit Hilfe von Maven passieren.
Marco Grawunder 10.2 91
Marco Grawunder 23.1 92 [[image:1755246072443-191.png]]
Marco Grawunder 10.2 93
94
Marco Grawunder 23.1 95 [[image:1755246118807-452.png]]
Marco Grawunder 10.2 96
Marco Grawunder 2.2 97
Marco Grawunder 25.3 98 == Logging umstellen ==
Marco Grawunder 3.1 99
mgrawunder 60.1 100 Wenn man möchte, kann man das Logging umstellen.
101
Marco Grawunder 23.1 102 [[image:1755246135109-325.png]]
103
104
105 [[image:1755246147827-679.png]]
106
107
108 [[image:1755246162330-595.png]]
109
Marco Grawunder 25.3 110 == Development Profil aktivieren ==
Marco Grawunder 23.1 111
mgrawunder 60.1 112 Damit das Testen einfacher geht, gibt es ein spezielles Spring-Profil. In diesem werden automatisch user1-user9 mit jeweils dem identischen Passwort angelegt und man spart sich die Registierung.
Marco Grawunder 25.3 113
mgrawunder 60.1 114 Wenn man die Anwendung einmal gestartet hat, kann man dies Configuration anpassen:
115
116 [[image:1757399848941-253.png||height="209" width="558"]]
117
Marco Grawunder 23.1 118 [[image:1755246173415-934.png]]
119
120
mgrawunder 37.3 121 **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: **
Marco Grawunder 23.1 122
123 **SPRING_PROFILES_ACTIVE=dev**
124
Marco Grawunder 26.2 125 [[image:1755248752596-839.png]]
126
mgrawunder 60.1 127 Danach muss man den Server neu starten!
Marco Grawunder 26.2 128
129 == Client starten ==
130
mgrawunder 60.1 131 Wenn der Server gestartet ist, kann man mehrere Clients starten. Dafür auf jeden Fall die Klasse Main verwenden.
132
133 **Sollte es nun Problem geben, schauen Sie bitte, ob Sie noch eine alte Java-Version auf ihrem System installiert haben. Wir brauchen mindestens Java 21!**
134
Marco Grawunder 23.1 135 [[image:1755246257400-525.png]]
136
137
138 [[image:1755246212916-883.png]]
139
140
141 [[image:1755246223246-834.png]]
142
143
Marco Grawunder 26.2 144 === Mehrere Instanzen des Clients ermöglichen ===
145
mgrawunder 60.1 146 Standardmäßig erlaubt IntelliJ nicht das Starten mehrerer Clients. Man könnte nun mehrere Configurations für den Client anlegen. Man kann aber auch in der Konfiguration unter "Modify options" den Haken bei "Allow multiple instances" setzen. Dann kann eine beliebige Anzahl von Clients gestartet werden.
147
Marco Grawunder 23.1 148 [[image:1755246233218-893.png]]
149
150
Marco Grawunder 27.1 151 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.
Marco Grawunder 26.2 152
Marco Grawunder 23.1 153 [[image:1755246292057-581.png]]
154
Marco Grawunder 30.2 155
156 = Kurzer Blick ins Basisprojekt =
157
158 [[image:1755249096987-249.png]]
159
160
161 [[image:1755249136156-419.png]]
Marco Grawunder 33.1 162
163
164 == Screenshots ==
165
166 [[image:1755249228556-469.png]]
167
168
169 = Kommunikation Client ~-~-> Server =
170
171 [[image:1755249285866-367.png]]
172
Marco Grawunder 34.1 173 Der Server verwendet das REST-Protokoll und als Austauschformat JSON
174
175 = OpenAPI =
176
mgrawunder 37.3 177 (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)
178
Marco Grawunder 34.1 179 [[image:1755250026156-269.png]]
180
181 [[image:1755250050031-304.png]]
182
183 * **Paths**: Endpunkte der API (z.B. /users, /lobbies).
184 * **Operations**: Spezifikation von Methoden wie GET, POST.
185 * **Definitions**: Detaillierte Beschreibung von Eingabe- und Ausgabestrukturen.
186 * **Security**: Authentifizierungsmechanismen.
187
188 [[image:1755250061990-172.png]]
Marco Grawunder 36.1 189
190 Kann JSON oder YAML (Yet Another Markup Language) verwenden YAML ist wie JSON nur mit weniger Klammern
191
192 [[image:1755250157536-746.png]]
mgrawunder 37.3 193
194 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]]
195
196 Dort wird die Datei auch grafisch dargestellt.
197
198
mgrawunder 37.4 199 = Maven und OpenAPI =
200
mgrawunder 38.2 201 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]]
mgrawunder 37.4 202
mgrawunder 38.2 203 Man kann dabei jetzt einen Kommandozeilenaufruf verwenden oder man setzt auf das im Basisprojekt vorhandene MVN ()
mgrawunder 37.4 204
mgrawunder 38.2 205 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:
mgrawunder 37.4 206
mgrawunder 38.2 207 == Client ==
mgrawunder 38.1 208
mgrawunder 38.2 209 Im Client werden die Apache Http Bibliothek verwendet.
210
211
212 [[image:1756887005209-855.png]]
213
214 == Server ==
215
216 Im Server wird Spring (Boot) verwendet
217
218 [[image:1756887037619-847.png]]
219
220 TODO: Weitere Informationen zu
221
222 - Lombok
223
224 - Dependency Injection
225
226 - Spring (Boot), siehe auch [[https:~~/~~/www.marcobehler.com/guides/spring-framework>>https://www.marcobehler.com/guides/spring-framework]]
227
228
229
mgrawunder 38.1 230 = Erweiterung der REST-Schnittstelle =
231
mgrawunder 38.2 232 In diesem Beispiel wird einmal gezeigt, wie die REST-Schnittstelle des Basisprojektes einfach erweitert werden kann.
233
234 In diesem Beispiel soll die aktuelle Schnittstelle um die Möglichkeit erweitert werden, alle Lobbies vom Server zu bekommen.
235
236 == Schritt 1: Erweitere das OpenAPI-Dokument ==
237
238 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.
239
240 Die Funktion soll sehr einfach sein und keine Parameter verlangen. Dafür bietet sich die GET-Funktion an.
241
242 Im folgenden Bild sind alle Anpassungen zu sehen:
243
244 [[image:1756887436525-790.png||height="355" width="974"]]
245
246
247 Nach dem Speichern, sollte das OpenAPI-Dokument wie folgt aussehen
248
249 [[image:1756887488020-376.png||height="642" width="904"]]
250
251
mgrawunder 38.3 252 Jetzt kann man entweder in IntelliJ
mgrawunder 38.2 253
mgrawunder 38.3 254 [[image:1756888245896-845.png||height="347" width="620"]]
255
256 oder im Terminal (z.B. auch in IntelliJ)
257
258 [[image:1756888279902-777.png||height="637" width="1053"]]
259
260 Wobei hier auch clean compile reichen würde.
261
262 **ACHTUNG! Falls maven Problem macht, kann das auch an einer falschen Java-Version im System liegen (siehe auch [[FAQ>>doc:.Basisprojekt FAQ.WebHome]])**
263
264 Es werden durch den Aufruf neue Inhalte generiert (bzw. die alten überschrieben).
265
266 [[image:1756888428042-802.png||height="538" width="1077"]]
267
268 Hinweis: Niemals Änderungen unterhalb des target-Ordners machen. Das wird von Maven bei clean gelöscht.
269
270 === Wie bekommt man dann aber nun die Funktionalität rein? ===
271
272 Für jeden Endpunkt (also aktuell lobbies und users) werden drei Interfaces/Klassen erzeugt:
273
274 * *Api (z.B, LobbiesApi): Beschreibung der REST-Methoden, vor allem auch das Mapping von z.B. /lobbies/join auf die Methode lobbyJoin(String)
275 * (((
276 *ApiController implements *Api (Für Spring) (z.B. LobbiesApiController)
277 )))
278 * (((
mgrawunder 40.2 279 *ApiDelegate (z.B. LobbiesApiDelegate): Macht die eigentliche Arbeit und muss** im eigenen Code-Bereich** erweitert werden!
mgrawunder 38.3 280 )))
281
282
283
284 == Schritt 2: Erweiterung auf Server-Seite ==
285
286 Da es schon Funktionen für die Lobbies gibt, gibt es auch bereits eine Implementierung, die LobbiesApiDelegate überschreibt
287
288 [[image:1756888762381-912.png||height="48" width="789"]]
289
290 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).
291
292 In der Klasse muss man dann die neue Methode lobbyList aus der API überschreiben.
293
294 [[image:1756888929507-312.png||height="156" width="1161"]]
295
296 Dabei wird folgendes gemacht:
297
298 1. Es wird ein Rückgabeobjekt vom Typ Liste erzeugt
299 1. Es wird über alles Lobbies auf dem Server gegangen (lobbyManagement.getLobbies())
300 1. Da der Client u.U. nicht die vollständigen Informationen über die Lobbies bekommen soll, gibt es zwei unterschiedliche Klassen: ServerLobby und LobbyDTO.
301 1. Die Foreach-Schleife sorgt dafür, dass in das Rückgabeobjekt nur die LobbyDTOs eingefügt werden.
302 1. Dafür wird eine Funktion mit dem Namen lobbyMapping verwendet
303 1. Schließlich wird am Ende gesagt, dass alles ok ist und eine Antwort ResponseEntity.ok mit dem Rückgabeobjekt (lobbies) gesendet.
304
mgrawunder 38.4 305 **Anmerkung**: Das Basisprojekt ist aktuell so eingerichtet, dass Spring Exceptions auffängt und entsprechend an den Client leitet. Diese findet in der Klasse  GlobalExceptionHandler statt
mgrawunder 38.5 306
307 Auf Server-Seite fehlt jetzt noch die Methode getLobbies im LobbyManagement
308
309 [[image:1756889590500-656.png||height="81" width="518"]]
310
311
312 === LobbyMapping ===
313
314 Da man relativ oft Server-Objekt in DTO umwandeln muss gibt es im Basisprojekt MapStruct. Damit muss man nur die DTO-Klasse anlegen (i.d.R. über OpenAPI!!)
315
316 Also z.B.
317
318 [[image:1756889440395-856.png]]
319
320 und definiert ein Interface mit einer Annotation
321
322 [[image:1756889472103-847.png]]
323
324 und damit kann man die Funktion aufrufen. Hinweis: Der Mapper ist im LobbyService über die Spring Dependency Injection gebunden.
mgrawunder 39.1 325
326 == Schritt 3: Erweiterung auf Client-Seite (Java) ==
327
328 Hinweis: Das Beispiel bezieht sich hier auf eine Client mit Java. Für andere Clients wie Angular ist das Vorgehen anders.
329
330 Auf der Client-Seite wird die komplette Kommunikation mit dem Server in der generierten Klasse DefaultApi gekapselt.
331
332 [[image:1756889795622-530.png]]
333
334 Dort gibt es eine neue Methode lobbyList. Die sorgt dafür, dass der REST-Aufruf auf die Server-Seite geht und liefert das passende Objekt List<LobbyDTO> zurück
335
336 Im Client gibt es auch eine Klasse LobbyService. Dort ist die DefaultApi Klasse über Dependency Injection gebunden.
337
338 [[image:1756889917681-650.png]]
339
340 Dort kann man nun eine neue Methode getLobbies() integrieren:
341
342 [[image:1756889979252-910.png]]
343
344 Und das Ganze dann z.B. im MainMenuPresenter verwenden:
345
346 [[image:1756890010118-149.png||height="116" width="972"]]
347
348 Anmerkung: Obwohl DefaultApi alle Funktionen zum Server kapselt, sollte man im Client spezifische Services für bestimmte Bereich haben, die diese Klasse verwenden.  Das führt zu einer besseren Trennung von Funktionalitäten im Code.
349
mgrawunder 40.2 350
351 = Kommunikation: Server ~-~-> Client (WebSockets) =
352
353 [[image:1756890800817-370.png||height="604" width="1121"]]
354
mgrawunder 51.2 355 Da man mit REST nicht Nachrichten vom Server an den Client schicken kann, werden im Basisprojekt dafür WebSockets verwendet.
356
357 Spring bietet eine native Unterstützung von WebSockets. Für eigene Funktionen kann man sich in die Kommunikation über die Serverklasse WebSocketHandler einklinken
358
359
360 [[image:1756890924024-346.png||height="377" width="1092"]]
361
362
363 Sobald sich jemand beim Server für WebSockets angemeldet hat wird von Spring ein org.springframework.web.socket.messaging.SessionConnectedEvent
364 geworfen, welches in der folgenden Methode (im WebSocketHandler) aufgefangen wird
365
366 [[image:1756890958794-603.png||height="373" width="1087"]]
367
368 Die Methode ist Observer für das Event SessionConnectedEvent
369
370 Der WebSocketServer kennt die Nutzer und erlaubt das Einloggen nur, wenn Login und Passwort stimmen (durch Spring Security)
371
372 [[image:1756891019715-621.png]]
373
374 1)Aus dem Event kann der Nutzer gelesen werden (der sollte nie leer sein)
375
376 2) Dann wird sich aus dem Repository (später mehr) der Nutzer geholt, der durch den Namen identifiziert ist (z.B. „test1“)
377
378 3) Schließlich werden allen anderen darüber informiert, dass ein neuer Nutzer da ist
379
380 == STOMP ==
381
382 WebSockets haben kein Protokoll (wie z.B. http)
383
384 Es können entweder binäre oder textuelle Daten verarbeitet werden (die jeweiligen Gegenstellen müssen das wissen!)
385
386 Wenn man jetzt mehr als nur Text verschicken möchte, muss man sich überlegen, wie man Objekte z.B. mit JSON serialisiert (analog zu REST)
387
388 STOMP: Streaming Text Oriented Messaging Protocol
389
390 Definiert ein einfaches Protokoll, welches es erlaubt, sinnvoll über WebSockets zu kommunizieren
391
392 Ist ein Teil von Spring
393
394 Methoden sind z.B. CONNECT, SEND oder SUBSCRIBE
395
396 STOMP arbeitet mit Topics
397
398 Ein Client registriert (SUBSCRIBE) sich für bestimmte Ereignistypen
399
400
401 §Wenn auf der Server-Seite dieser Typ veröffentlich wird dann wird dies an die jeweils interessierten Clients geschickt
402
403 Publish/Subscribe-Pattern
404
405 [[https:~~/~~/docs.spring.io/spring-framework/reference/web/websocket/stomp.html>>url:https://docs.spring.io/spring-framework/reference/web/websocket/stomp.html]]
406
407
408 §Der Server definiert unterschiedliche Topics (je nach Modul)
409
410 §Beim Nutzermanagement aktuell:
411
412 §/topic/users/loggedIn: Es hat sich ein neuer Nutzer angemeldet
413
414 §/topic/users/loggedOut: Ein Nutzer hat sich ausgeloggt
415
416
417 [[image:1756891125969-748.png||height="317" width="726"]]
418
419 §Topic-Namen sind Strings, sollte aber Aufbau von oben entsprechen
420
421 §In der Lobby würde es stattdessen /topic/lobbies/* heißen
422
423 == WebSockets: Versenden von Nachrichten ==
424
425 [[image:1756891180516-843.png||height="426" width="801"]]
426
427 [[image:1756891216134-578.png||height="428" width="699"]]
428
429 == Nachrichteninhalt ==
430
431 [[image:1756891254830-647.png||height="101" width="777"]]
432
433 * message kann grundsätzlich alles sein, was serialisiert werden kann
434 * Man könnte nun einfach die Java-Serialisierung verwenden (im alten Basisprojekt ist das auch so)
435 * Das hat aber eine Reihe von Nachteilen
436 ** Der Empfänger muss dafür unbedingt auch ein Java-Client sein und er muss exakt dieselbe Klasse bei sich haben, damit der das Objekt wieder zurück in ein Java-Objekt umwandeln kann
437 ** Es gibt eine Reihe von Sicherheitsproblemen
438 * Besser: Definiere ein gemeinsames Austauschformat, was viele verstehen ~-~-> Im Basisprojekt (und in vielen anderen Projekten auch) JSON verwenden
439 * Insbesondere Web-Clients (JavaScript) bieten hervorragende Möglichkeiten, an JSON zu verarbeiten
440 * Client und Server haben sich damit auf Format für den Austausch geeinigt
441 ** Topic: Strings
442 ** Message: JSON
443
444 An den Clilent werden auch bei WebSockets nur DTOs verschickt! (userMapping)
445
446 [[image:1756891375095-158.png||height="266" width="775"]]
447
448 == Wie verbindet sich ein Client mit dem Server? ==
449
450 UserService bietet eine Methode zum Login an. Diese ruft nun aber keine REST-Endpunkt auf (da man sich sowieso bei JEDEM Aufruf authentifizieren muss, macht so ein Endpunkt kein Sinn). Stattdessen wird die Verbindung mit dem WebSocket hergestellt und dort Nama und Passwort überprüft.
451
452 [[image:1756891512330-186.png||height="170" width="820"]]
453
454 === Auf Server Seite (WebSocketConnectionManager): ===
455
456 [[image:1756891551794-161.png||height="387" width="1019"]]
457
458 1) Variablen definieren
459
460 2) WebSocketClient erzeugen
461
462 3) Daraus WebSocketStompClient machen
463
464 4) Jackson als Mapper definieren (DTO-Object <-> JSON)
465
466 === [[image:1756891617399-232.png||height="289" width="1006"]] ===
467
468
469 1) Asynchron die Verbindung zum Server aufbauen
470
471 2) Wenn erfolgreich in das Hauptmenü wechseln (showScene à später mehr)
472
473 3) Über den Kontext ein Event pushen LoggedInEvent
474
475 4) Jede Serververbindung hat eine Session