1. 2022-09-26 REST
Beitrag: Peter Klose & Thomas Spindler
1.1. Grundproblem
Wir haben mehrere verschiedene Computer, die alle mit unterschiedlicher Hard- und Software arbeiten. Damit diese problemlos miteinander kommunizieren können, gibt es Protokolle. REST ist eines der vielen verschiedenen Protokollen, die dieses Problem lösen.

1.2. REST
"HTML ist das Internet der Menschen, Rest ist das Internet für Maschinen" |
Rest wir verwendet, um Daten zwischen zwei Systemen auszutauschen. Hierbei verwendet man die typische Client- / Serverkonfiguration
Der Client holt sich die Informationen, die dieser Benötigt vom Server, oder sagt dem Server, dass er Informationen löschen oder speichern soll.
1.2.1. Methoden von REST
Rest hat verschiedene Methoden, die sich an CRUD orientieren.
CRUD = Create, Read, Update, Delete |
-
POST (erstellen und speichern)
-
GET (lesen)
-
PUT (update gesamte Ressource)
-
PATCH (nur einzelne Felder ändern)
-
DELETE (löschen)
Es gibt noch weitere Methoden, wie z.B OPTIONS.
1.2.2. URL
Um die richtigen Resource vom Server zu bekommen, wird eine URL verwendet.
URL = Unified Resource Locator |
Wie der Name schon sagt, dient eine URL dazu, dass sie den Pfad der Resource angibt. Dies ist vergleichbar mit Dateipfaden.
Beispiele für URLs
Schema einer URL:
URI = scheme ":" ["//" authority] path ["?" query] ["#" fragment] authority = [userinfo "@"] host [":" port]
Beispiele:
https://www.example.com/index.html https://www.example.com/person?vname="hans"&nname="muster"
Beim zweitem Beispiel werden 2 weitere Parameter mitgegeben.
nname = hans
vname = muster
Diese sind einfache Variablen mit Werten.
1.2.3. JSON
REST verwendet als unterliegendes Protokoll HTTP. Die Daten an sich werden allerdings im JSON format transportiert.
Früher wurde oft XML für den Datentransfer verwendet (vor REST). XML hat allerdings einige Nachteile gegenüber dem neueren JSON. Aus diesem Grund verwendet REST JSON.
XML vs JSON
XML
Zeichen: 187 |
JSON
Zeichen: 121 |
JSON ist hier effizienter, da es weniger Zeichen als XML hat.
Ebenfalls ist JSON meistens einfacher zu lesen als XML.
1.2.4. Endpoint
Ein Endpoint ist eine Schnittstelle für die Daten.
Jeder Endpoint hat eine URL und eine Methode, die dieser verwendet.

1.2.5. Server Architektur
Auf dem Server werden die Anfragen entgegengenommen und verarbeitet. Hierbei kann der Server weitere Verbindungen aufbauen (Datenbank, weitere REST requests, ..), oder Berechnungen durchführen.
Dieser ist mit folgender Architektur aufgebaut:

Bei klassischen Anwendungen, (die wir vor allem in den letzten Jahren programmiert haben, hatte sich die Anwendung direkt mit der Datenbank verbunden. Dies ist allerdings aus Sicherheitsgründen schlecht. Ebenfalls sind Webapps einfacher, moderner und vernünftiger als z.B. Java FX.
Daher ist es ebenfalls besonders wichtig, die Daten, die der Client mit einem POST request übermittelt, am Server zu überprüfen, bevor diese gespeichert werden
2. 2022-10-03 REST, REST in Quarkus
Beitrag: Peter Klose & Thomas Spindler
2.1. Rest
Rest ist Zustandslos, das heißt, dass es grundsätzlich keine Sessions gibt. Dies bedeutet aber auch, dass Anmeldeinformationen, oder weitere Tokens und Cookies bei jeder Anfrage erneut gesendet werden müssen.
2.1.1. Rest Request
Ein Rest-Request ist, wenn der Client etwas vom Server anfordert. Dies muss den REST Methoden entsprechen.
2.3. JPA
-
Persistence
-
dauerhaft speichern
-
die Daten überleben den Prozess, der sie erstellt hat.
-
Bsp: File, DB, ev. Serialisierung (ist auch File)
-
-
transient
-
flüchtig
-
die Daten werden mit dem Prozess, der sie erstellt hat, gelöscht
-
zB Variablen im Programm
-
2.3.1. Quarkus Profiles
-
Quarkus hat per default drei Profile:
-
dev
-
prod
-
test
-
-
Die Profile haben den Vorteil verschiedene Konfigurationen bei unterschiedlichen Anwendungsfällen zur Verfügung zu stellen. Z.B. wird eine eigene Datenbank zum Testen verwendet
-
Man erkennt das jeweilige Profil in der
application.properties
durch den Prefix %prod, %test, %dev -
dev
-
ist development modus
-
automatisches Hot Reloading, wenn Code geändert wird
-
-
test
-
wird zum Testen verwendet
-
meist wird eine eigene Testdatenbank gestartet
-
-
prod
-
Ist optimierter (z.B. startet schneller)
-
hat dafür keine dev-Console, keinen Swagger (nicht automatisch) usw.
-
2.3.2. Was muss man tun, um eine Entity-Klasse zu persistieren?
Dependencies in pom.xml eintragen
-
JDBC-Treiber der Datenbank
-
der OR-Mapper (Object Relational Mapper, ORM)
-
in Quarkus wird standardmäßig Hibernate verwendet.
-
DB-Credentials in application.properties eintragen
quarkus.datasource.username=postgres
quarkus.datasource.password=postgres
quarkus.datasource.db-kind=postgresql
quarkus.hibernate-orm.database.generation=drop-and-create
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db
Datenbank starten
docker run --rm=true \
--name postgres-payment \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-e POSTGRES_DB=db \
-v ${PWD}/db-postgres/db:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:13.3-alpine
Erstellen einer Entity-Klasse
@Entity (1)
@Table(name = "MY_PERSON")
public class Person {
@Id (2)
@GeneratedValue(strategy = GenerationType.IDENTITY) (3)
@Column(name = "P_ID")
private Long id;
@Column(name = "P_FIRST_NAME")
private String firstName;
@Column(name="P_LAST_NAME")
private String lastName;
// constructors omitted for brevity
// getter and setter omitted for brevity
}
1 | Annotation @Entity wird benötigt |
2 | Eine Id wird benötigt → @Id |
3 | Hier wird ein Autowert-Feld in der DB erstellt <.> |
3. 2022-10-17 Tabellenbeziehungen in JPA
-
transient
-
persistent
3.1. Modi von Datenbanken
-
Network: Datenbank und Java Programm laufen in getrennten JVMs
-
Embedded: Datenbank und Java Programm laufen in derselben JVM
-
InMemory:
-
Die Datenbank läuft im Hauptspeicher
-
besonders gut geeignet für Testen, da sehr schnell
-
3.2. Beziehungen zwischen Entities
Beziehung | Beschreibung | Bsp |
---|---|---|
Assoziation |
zwei unterschiedliche Entites haben eine Beziehung |
ein Auto hat ein Kennzeichen (oder mehrere im Zeitablauf) |
Aggregation |
Ein Objekt besteht aus anderen Objekten |
zB Auto hat 4 Räder |
Komposition |
Ein Object besteht aus anderen Objekten. Diese können nicht zerstörungsfrei zerlegt werden. |
Ein Haus hat mehrere Etagen |
Vererbung |
Ein Objekt erbt von einem anderen dessen Eigenschaften |
Ein Pkw ist ein Kfz und erbt dess Attribute |
Realisierung |
(Implementierung) |
Serializable - Interface |
3.3. Mikroprojekte
Mikroprojekt-Einteilung
Name | Thema |
---|---|
Thaller David |
Gebäudeverwaltung (wo sind welche Geräte installiert zB Chromecasts) |
Klose Peter |
Linienbusunternehmen inkl. Fahrplan |
Schatzberger Oliver |
Supermarkt |
Eder Moritz |
Teehändler |
Hager Sebastian |
Friedhofsverwaltung |
Al Sabagh Abdulrahman |
Gärtnerei |
Reiter Lydia |
Tanzverein |
Spindler Thomas |
Rezeptseite |
Horner Paul |
Hotel |
Weinhäupl Valentin |
Fussballverein |
Lummerstorfer Lukas |
Tennisverein |
Just Elias |
Stadtrundfahrten |
Angerer Mona |
Too good to go - App - Clone |
3.4. Aufgabe 1 - Mikroprojekt
-
Erstellen eines Quarkus-Projekts
-
Das Quarkus Projekt ist in einem Ordner
backend
. -
Es gibt einen Ordner
asciidocs
entsprechend dem Repo -
Später wird noch ein
frontend
-Projekt hinzugefügt
-
-
git
-
Es sind genügend aussagekräftige Commits zu erstellen
-
Beim Entwickeln ist jeweils in einem feature-Branch zu entwickeln und dann in den main-Branch zu mergen.
-
-
Es sind Tests zu verwenden
-
Dabei sind primäre assertj-core und assertj-db zu verwenden.
-
-
Es ist ein Datenmodell zu erstellen (max. 5 Tabellen)
-
als plantuml-Diagramm in der Dokumentation angeben
-
dann melden → Korrektur
-
4. 2022-11-07
4.1. Context & Dependency Injection - CDI
-
Es gibt 3 Arten um Objekte zu erhalten:
-
mit new und Constructor
-
mittels einer Fabrik-Methode
-
dependency injection → ein übergeordneter Container hält Objekte vor (in einem Pool). Mit der Annotation @Inject werden diese Objekte einer Refernzvariablen zugewiesen
-
4.3. Logging
-
Logging-Levels
-
INFO
-
DEBUG
-
TRACE
-
ERROR
-
-
rolierendes Logging
-
Bsp
-
Es gibt 3 Logfiles
-
Die Logs werden in ein File geschrieben. Ist dieses File 10kB groß, wird in das nächste File geschrieben. Anschließend in das dritte File.
-
Erreicht auch das dritte File die Größe von 10kB, dann wird das erste File gelöscht und neu beschrieben.
-
-

5. 2022-11-14
5.1. Strategie zum Erzeugen von Id’s
5.1.1. TABLE
-
Es wird eine Tabelle erstellt.
-
Diese Tabelle hat nur eine Spalte ID und eine Zeile
-
Der Wert ID wird immer inkrementiert
-
Alle Tables holen sich den nächsten Wert aus dieser Table
-
Variante:
-
Die Tabelle hat 2 Spalten: TABLE und ID
-
ZB TABLE Person hat die ID 500
-
zB TABLE Rechnung hat die ID 2378
-
Dadurch können die Tables jeweils mit einer durchgehenden Folge von Zahlen versehen werden
-
6. 2022-11-21
6.1. Aufgabe Microproject
-
Erstellen eines Datenmodells mit 3- max. 5 Entitäten.
-
Erstellen von Rest-Endpoints mit CRUD-Funktionalität
-
Ggf. Verwendung von Data Transfer Objects
-
Erstellen von Integrations- und Systemtests
-
Erstellen von Queries
6.2. Aggregate Pattern

7. 2023-01-23
7.2. MOB Programming
Es ist ein System zu implementieren, welches uns ermöglicht Autos und Personen zu speichern. Ein Auto soll dabei nur einer Person zugeordnet werden. Eine Person kann mehrere Autos besitzen.
-
Daten von: Mockaroo
-
Quarkus Projekt:
-
Hibernate ORM with Panach
-
RESTEasy Classic Jackson
-
RESTEasy Classic Qute
-
JDBC Driver - PostgreSQL
-
SmallRye OpenAPI
-
SmallRye GraphQL
-
-
Datenbank Postgres
10. 2023-06-05
10.1. Übung MQTT-Client
-
Erstellen Sie einen MQTT-Client mit Quarkus mit folgender Funktionalität
-
In einer Datenbank sind Werte nach Kategorien gespeichert (Schreiben Sie hierzu einen Data Faker)
-
Verwenden Sie hierbei optimistisches Locking
-
-
In einer Tabelle ist gespeichert, welche Kategorien auf den mqtt-Server gesendet werden
-
Mittels REST-Request können Kategorien aktiviert oder deaktiviert werden, dh sie werden an den mqtt-Server gesendet oder nicht
-
Bitte verwenden Sie folgende topic-Struktur
/labs/2223/4bhitm/lab07/nachname
-

