Wiki source code of Basisprojekt
Version 38.4 by mgrawunder on 2025/09/03 10:47
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 | **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 |