Mikroprojekte - Themenvergabe
lfd.Nr. Name Thema Feedback

1

Daniel

Tageszeitung

2

Karawane

Produktionsbetrieb (Fließband)

3

Benjamin Musikfreund 1

Centermanager

4

Paul

Baustellenkoordinator

5

Jonas die Birke

Baumschule

6

Nico

Kochrezepte

7

Benjamin Eggman

Farmverwaltung

8

Moritz Brille

Optiker

9

Lorenzius

Facility Management

10

Lukas Hörnchen

Zooverwaltung

11

Nathalie

Event-Manager

12

Tarik Tarik

Reisebüro

13

David Musikfreund 2

Plattenlabel

14

Jan Händler

Parkplatzverwaltung

15

Vinzent K

Skischule

16

Muhammet

Fitnessstudio

17

Marcel die Ecke

Fakturierung

18

Moritz ohne Brille

Kfz-Händler

19

Jimmy

Friseurladen

20

Roberto

Restaurant

21

Felix der Große

Juwelier

22

Eminem

Busreisen (inkl Schulbusse)

23

Bocki Musikfreund 3

Autovermietung

24

Patrick

Tanzschule

25

Fabian Woody

Bücherei

26

Philip Cokeman

Friedhofsverwaltung

27

Marc Krimiman

Callcenter

1. 2020-09-21

2. 2020-09-24

2.1. Create your First Quarkus Project

Project created; not yet started

3. 2020-09-28

  • Quarkus running

    • JSON-B (for json)

    • JAXB (for xml)

4. 2020-10-05

4.1. Assignment 1: CRUD-REST-Endpoint for One Entity

Create a simple application for your micro-project-topic in Quarkus:

  1. lastname-projectname zB mustermann-restaurant In the package at.htl.<projectname>.entity zB. at.htl.restaurant.entity create a new entity-class ie Product (in this restaurant are the products dishes and beverages)

  2. Store the data in a collection in a appropriate repository (you use NO database)

  3. in the package at.htl.<projectname>.boundary (ie at.htl.restaurant.boundary) create a class <Entity>Service.java ie ProductService.java

  4. In this class create some endpoints to provide CRUD-functionality.

    • Use

      • JsonObject

      • JsonArray

      • Response

      • marshalling of an object

  5. In a file request.http create the appropriate requests, for consuming your endpoints.

  6. The endpoints are supposed to work with data in JSON- or XML-format

  7. Use Swagger for documenting your endpoints.

  8. Create an essential description of your project in the README.md

  9. Don’t forget to exclude the files, which are not supposed to be stored in the github-repo.

  10. Create an commit for each endpoint with appropriate messages for each commit.

  11. Deadline: 12.October 2020, 23:59

  12. You can find the Classroom Link at Discord.

Use a master data table (Stammdatentabelle)
____   ____.__       .__    ___________        _____      .__
\   \ /   /|__| ____ |  |   \_   _____/_______/ ____\____ |  |    ____
 \   Y   / |  |/ __ \|  |    |    __)_\_  __ \   __\/  _ \|  |   / ___\
  \     /  |  \  ___/|  |__  |        \|  | \/|  | (  <_> )  |__/ /_/  >
   \___/   |__|\___  >____/ /_______  /|__|   |__|  \____/|____/\___  /
                   \/               \/                         /_____/

4.2. Begriff des Marshalling

marshalling
unmarshalling

5. 2020-10-08

5.1. CRUD - Methoden

http-method Anwendung

POST

Erstellen einer neuen Resource (Datensatz)

PUT

Ändern einer existierenden Resource

PATCH

Ändern einer existierenden Resource, jedoch nur einen Teil (zB. ein Feld)

GET

Lesen einer Resource

DELETE

Löschen einer Resource

5.2. Testing a REST-Endpoint

<dependency>
  <groupId>org.assertj</groupId>
  <artifactId>assertj-core</artifactId>
  <version>3.17.2</version>
  <scope>test</scope>
</dependency>
package at.htl;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.assertj.core.api.Assertions.assertThat; (1)

@QuarkusTest (2)
public class ExampleResourceTest {

    @Test
    public void testHelloEndpoint() {
        String actual = given()
                .when()
                    .get("/api")
                .then()
                    .statusCode(200)
                    .extract()
                    .body()
                    .asString();
        System.out.println(actual);

        assertThat(actual)
                .startsWith("hello 3ahif! ->");
    }

}
1 der statische Import ist kritisch
2 startet die Applikation auf einem eigenen Port

6. Bewertung Assignment 1

siehe Moodle

7. 2020-10-19

8. 2020-10-22

  • CDI

  • JAX-RS Param Annotations

  • Resilienz → Fähigkeit technischer Systeme, bei einem Teilausfall nicht vollständig zu versagen

9. 2020-11-09 - CDI

  • Scope …​ (Gültigkeits-)Bereich

    • zB Gültigkeitsbereich bei Variablen (i.N. ein Block)

    • zB Lebensdauer von Objekten (ApplicationScoped, SessionScoped, RequestScoped)

    • …​

  • CDI

    • C …​ Context …​ Lebensdauer der Objekte

    • DI …​ Dependency Injection …​ Injizieren einer Abhängigkeit

  • Was bringt CDI?

    • Inversion of Control / IoC: Das Programm muss sich nicht mehr um die Erstellung von Objekten kümmern, das übernimmt der Container

    • Dies führt zu wenig fehleranfälligen Programmen

      • Um Erstellen/Zuweisen/Löschen der Objekte kümmert sich der Container

      • Man kann einfach die Konfiguration ändern

        • Testcontainer mit Testobjekten

        • Produktiv-Container mit Real-Life-Objekten

  • Dependency

    • Eine Dependency oder Abhängigkeit beschreibt in der Softwareentwicklung, dass ein Programm ein bestimmtes Stück Code (z. B. Frameworks, Bibliotheken, Klasse) benötigt, um ordnungsgemäß zu funktionieren.

  • Wie kann ein Objekt erstellt werden?

    • Durch Verwendung des Schlüsselwortes new

    • Durch Verwendung von Design Patterns (Entwurfsmuster)

      • zB einer Factory (Design Pattern)

      • zB eines Builder Pattern (Erbauer)

    • Durch Dependency Injection

Objekterstellung mit "new"

create object with new

  • Erstellt man ein Objekt mit "new", so ist man selbst für die Lebensdauer verantwortlich

    • Man kann das obige Person-Objekt löschen, indem man die Referenz auf das Objekt auf null setzt

    • Der Garbage Collector gibt den Speicherpaltz des Objekts frei, da keine Referenz mehr auf das Objekt verweist.

Durch NULL-setzen der Referenzvariablen wird der Speicherplatz freigegeben.

remove object

  • Bei CDI ist der sogenannte DI-Container verantwortlich für

    • das Erstellen von Objekten

    • das Zuweisen zu einem Context (Lebensdauer)

    • das Zuweisen von Objekten zu Variablen

    • das Löschen von Objekten (Freigeben des Speicherplatzes)

    • man spricht von "container-managed" Objekten oder auch Java-Beans

    • Durch Verwendung von Annotationen (@ApplicationScoped, @SessionScoped, @RequestScoped) kann man die Lebensdauer beeinflussen.

    • Mit @Inject kann der Developer eine Instanz einer Klasse anfordern.

  • The container is the environment where your application runs.

  • Was ist ein Servlet

    • Ein Servlet ist DIE Methode, um Java-Code aus dem Internet (mittels TCP/IP)) aufrufen zu können

    • Viele Bibliotheken zB JAX-RS, JSF usw verwenden im Hintergrund Servlets.

9.1. Logging in Jakarta EE (Quarkus)

  • Es wird empfohlen den jboss-Logger zu verwenden.

@ApplicationScoped
public class GreetingService {

    private static final Logger logger = Logger
            .getLogger(GreetingService.class.getSimpleName()); (1)

    int counter;

    public String greeting(String name) {
        logger.info(String.format("Hello %s (%d x verwendet)", name, ++counter)); (2)
        return String.format("Hello %s (%d x verwendet)", name, ++counter);
    }
}
1 Man muss einen Logger deklarieren. Der Klassenname wird übergeben.
2 Man kann den Logger verwenden
Output des Loggers in Console
2020-11-06 09:40:53,795 INFO  [at.htl.con.GreetingService] (executor-thread-198) Hello susi (1 x verwendet!)
  • Es gibt Log-Levels

    • INFO

    • ERROR

    • FATAL

    • DEBUG

    • …​

  • Es gibt sogenannte Appender zur Ausgabe auf verschiedenen Medien

    • Konsole

    • in Text-Files (auch rotierend)

      • zB 3 Files mit einer bestimmten Größe (zB 10k).

      • Sind alle 3 Files beschrieben, wird das erste File gelöscht und neu beschrieben

      • Vorteile:

        • Der Speicher (Festplatte) wird nicht vollgeschrieben

        • Es stehen immer Log-Meldungen aus der Vergangenheit zur Verfügung

    • in Datenbanken

    • auf einen REST-Endpoint

    • Log-Collector zB GrayLog

    • …​

9.1.1. Logging mit Dependency Injection

Man kann auch einen Logger mit DI injizieren

Erstellen des Producers
public class LoggerProducer {

    @Produces
    public Logger produceLogger(InjectionPoint injectionPoint) {
        return Logger.getLogger(injectionPoint.getBean().getBeanClass());
    }
}
Verwendung des injizierten Loggers
@ApplicationScoped
public class GreetingService {

    @Inject
    private Logger logger; (1)

    int counter;

    public String greeting(String name) {
        logger.info(String.format("Hello %s (%d x verwendet!)", name, ++counter)); (2)
        return String.format("Hello %s (%d x verwendet!)", name, ++counter);
    }

}
1 Die Logger Klasse wird injiziert.
2 Die Verwendung bleibt gleich

9.2. Offene Punkte

  • Warum funktioniert CDI nicht im Constructor?

  • Was kann ich machen, um trotzdem CDI bei der Erstellung von Objekten zu verwenden? → @PostConstruct

  • Autostart in Quarkus-Apps (@Observer)

10. 2020-11-12

10.1. Automatic Startup

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;

@ApplicationScoped
public class InitBean {

    @Inject
    Logger LOGGER;

    void onStart(@Observes StartupEvent ev) { (1)
        LOGGER.error("The application is starting...");
    }
}
1 add an Observer for lifecycle method

11. CDI and the Constructor

  • Warum funktioniert der Zugriff auf injizierte Ressourcen aus dem Konstruktor nicht?

Problem

cdi and constructor

Lösung: Einführen der PostConstruct-Methode
@ApplicationScoped
public class InitBean {

    Logger LOGGER;

    @Inject
    GreetingService greetingService;

    public InitBean() {
    }

    @PostConstruct  (1)
    private void init() {
        LOGGER.info(greetingService.greeting("Susi"));
    }

    void onStart(@Observes StartupEvent ev) {  (2)
        LOGGER.error("The application is starting...");
    }
}
1 wird nach dem Konstruktor, nachdem das Objekt fertig erstellt wurde, ausgeführt.
2 es gibt neben dem StartupEvent aupch ein ShutdownEvent
Zusammenfassung

lifecycles

11.1. Persistence

  • Grundprinzip (Folien)

12. 2020-11-16

12.1. Convention-over-Configuration

  • "Vereinbarung vor Konfiguration"

  • Man muss nicht das System extra konfigurieren

  • Es gibt eine vereinbarte Standardkonfiguration

  • Diese kann bei Bedarf geändert werden

12.2. Strategien für Primärschlüsselerstellung

  • IDENTITY

    • Autowert, AutoIncrement → in einem Tabellenfeld wird automatisch ein Zähler hochgezählt

  • SEQUENCE

    • Die Sequence ist ein eigenständiges Datenbankobjekt, die eine Folge von Zahlen generiert

    • in Reihenfolge, zufällig, rollieren usw.

    • kann man mit der Annotation @SequenceGenerator im Code erstellem

  • TABLE

    • die einfachste Variante

    • eine Tabelle (meist mit Namen SEQUENCE) hat ein Feld mit einer Zahl, die mit UPDATEs hochgezählt wird

    • Manchmal hat man für jede Tabellen-Id eine eigene Zeile

  • AUTO

    • eine der obigen Strategien wird automatisch gewählt (meist TABLE)

12.3. Transaktion

  • Transaktion …​ kleinste unteilbare Einheit

  • zB Überweisung in einer Bank

    • - von Konto A wird abgebucht

    • - auf Konto B wird aufgebucht

  • Logical Unit of Work (LUW)

  • Annotation @Transactional

@Inject
EntityManager em;

@Inject
UserTransaction tm;
...
@Test
void createPerson() throws SystemException, NotSupportedException, HeuristicRollbackException, HeuristicMixedException, RollbackException {
    Person susi = new Person("susi");
    tm.begin();
    em.persist(susi);
    tm.commit();
    Table personTable = new Table(getDataSource(), "person");
    output(personTable).toConsole();
    assertThat(personTable).hasNumberOfRows(1);
}

12.4. AssertJ-DB

pom.xml
<dependency>
  <groupId>org.assertj</groupId>
  <artifactId>assertj-db</artifactId>
  <version>2.0.2</version>
  <scope>test</scope>
</dependency>

13. 2020-11-23

14. Übung Miniprojekt JPA (Assignment 04 - JPA)

15. 2020-11-26

15.1. Persistence Context

Was ist der Persistence-Context
Person susi = new Person("susi");
em.persist(susi);
susi.setName("Suzie Quattro");
Inhalt der table nach Ausführung (Objekt befindet sich im Zustand "managed")
[person table]
|-----------|---------|-----------|---------------|
|           |         | *         |               |
|           | PRIMARY | ID        | NAME          |
|           | KEY     | (NUMBER)  | (TEXT)        |
|           |         | Index : 0 | Index : 1     |
|-----------|---------|-----------|---------------|
| Index : 0 | 1       | 1         | Suzie Quattro |
|-----------|---------|-----------|---------------|
  • Begriffspaar:

    • transient …​ flüchtig

    • persistent …​ dauerhaft speichern

15.2. Arten von Beziehungen zwischen Objekten

15.2.1. Vererbung

vererbung
Pkw kaefer = new Pkw();
  • 3 Strategien

    • SINGLE_TABLE

    • TABLE_CLASS (table per concrete class)

    • joined

15.2.2. Aggregation

  • besteht-aus, consists-of

  • Objekte können zerstörungsfrei getrennt werden

  • Bsp: Auto und Autoreifen

aggregation

15.2.3. Komposition

  • besteht-aus, consists-of

  • Objekte können nicht zerstörungsfrei getrennt werden

  • Bsp

    • Buch - Kapitel

    • Haus - Etage

komposition

15.2.4. Assoziation (<use>-Beziehung)

in verschiedenen Multiplizitäten (Kardinalität)

  • 1:*

  • 1:1

  • *:*

assoziation

16. 2020-11-30

Assignment 02 Grading

Thomas Stütz 1.1.0, 2020-09-21: crud endpoint for a single entity :sourcedir: ../src/main/java :icons: font :sectnums: // Nummerierung der Überschriften / section numbering

Download am 2020-11-28 19:22 and subsequent

lfd.Nr. Name Kommentar Note

1

01AD

1. Allgemeines

Angabe lesen → the quarkus-project is located in the root of the git repo

Dein Quarkus-Projekt befindet sich in einem Sub-Dir des git repos.

2. Datenmodell

Bin mir ziemlich sicher, dass das kein Class Diagram ist

a02 andricic cld

Wer suchet, der findet

a02 andricic cld2

  1. Eine id ist eigentlich nicht notwendig. Das Schlüsselkonzept gibt es so in der oo-Programmierung nicht.

  2. Long als @id (Objekttyp). Jetzt noch egal, aber mit Datenbanken wichtig.

  3. Das Klassendiagramm ist falsch!

    1. Ein Autor schreibt einen Artikel → ok

    2. Ein Leser liest einen Artikel → ev. auch ok

      • Allerdings kannn ein Artikel nur von einem Leser gelesen werden →

    3. Review ist falsch positioniert (wie man an der nichgt eingezeichneten Assoziation reviewedArticle sieht)

      • Review ist eigentlich die *:* - Auflösung zwischen Article und Reader

      • Ein Artikel kann von mehreren Lesern gelesen werden

      • Ein Leser kann mehrere Artikel lesen und reviewen

      • ARTICLE 1 --- * REVIEW * --- 1 READER

        • Die Entities sind sehr ausführlich gestaltet

3. Dokumentation

Die Beschreibung im README.md ist mangelhaft
Tageszeitung ist ein Rest-Service, welcher alle Authoren und Artikeln ordnet/speichert.
Das Projekt enthält 4 Klassen (Author, Article, Reader und Review).
Durch die Service-Klasse die für alle Requests zuständig ist, können
wir vom Author, Article und Reader jeweils eine Instanz erstellen und hinzufügen, löschen, updaten und lesen.

4. Projektstruktur (Maven)

Du musst genau arbeiten: Deine Projektstruktur entspricht nicht dem Maven Standard Directory Layout

a02 andricic maven

5. Automatisierte Tests

  • Deine Tests sind spartanisch (Test der Entites und auch Repositories). Damit kann man so ziemlich gar nichts testen.

    • und sie funktionieren nur teilweise

    • Du hättest zB die Methode public JsonObject asJsonObject() in der Klasse Article testen sollen.

    • Vermutlich hättest Du dann den Fehler im void AddArticleFromRepository()-Test vermeiden können

  • Methodennamen beginnen mit kleinem Anfangsbuchstaben.

  • Man sollte die Objekte direkt vergleichen, nicht nur die String-Repräsentation

suboptimal
a1.getBirthDate().toString().equals("2002-03-17");
besser
a1.getBirthDate().equals(LocalDate.of(2002, 03, 17));
  • Die Test sollen atomar sein, nicht aggregiert

So sollte ein Test nicht gestaltet sein, …​
void AuthorCreatedProperly() {
    Author a1 = new Author(1, "Daniel", "Andricic", LocalDate.of(2002, 03, 17));
    assertThat(a1)
            .isNotNull();

    boolean createdProperly = a1.getID() == 1
            && a1.getFirstname().equals("Daniel")
            && a1.getLastname().equals("Andricic")
            && a1.getBirthDate().toString().equals("2002-03-17");
            && a1.getBirthDate().equals(LocalDate.of(2002, 03, 17));
}
...da man in der Fehlermeldung nicht erkennen kann, was nun falsch ist

a02 andricic unit test1

besser
void AuthorCreatedProperly() {
    Author a1 = new Author(1, "Daniel", "Andricic", LocalDate.of(2002, 03, 17));
    assertThat(a1)
            .isNotNull();

    assertThat(a1.getID()).isEqualTo(1L);
    assertThat(a1.getFirstname()).isEqualTo("Daniel");
    assertThat(a1.getLastname()).isEqualTo("Andricicx");
    assertThat(a1.getFullName()).isEqualTo("Daniel Andricic");
    assertThat(a1.getBirthDate()).isEqualTo(LocalDate.of(2002, 3, 17));
}
i.S.v. aussagekräftiger:

a02 andricic unit test2

6. Imports

keine exotischen Libraries verwenden, zB hier bei Swagger
  <dependencies>
    ...
    <dependency>
      <groupId>io.springfox</groupId>
      <artifactId>springfox-swagger2</artifactId>
      <version>2.9.2</version>
    </dependency>
    ...
  </dependencies>
  • Man sollte vorsichtig sein beim Importieren von (unbekannten) Libraries → Nebeneffekte

korrekter Import (Extension Guide beachten)
  <dependencies>
    ...
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-smallrye-openapi</artifactId>
    </dependency>
    ...
  </dependencies>
  • In deinem Fall hast Du beide Imports verwendet.

  • Springfox bietet Libraries vorwiegend für Spring (!) an

  • Der LocalDate-XmlAdapter ist sehr gut

Berücksichtigung von null zB bei marshal(…​)
@Override
public String marshal(LocalDate value) throws Exception {
    return value == null ? null : value.toString();
}
  • Es fehlen sämtliche Tests für die Endpoints (request.http beinhaltet keine Tests)

7. Korrigiertes CLD

Diagram
  • gar nicht sauber:

    • falsche Notation <Attributname>: <Datentyp>

    • Beschriftung: innerhalb einer Klasse nicht "articleID" sondern nur id (wird ja eh über das entsprechende Objekt angesprochen)

    • In Review ist eine Assoziation zu Reader eingetragen (reviewer) aber nicht eingezeichnet

    • Zwischen Reader und Review ist eine Assoziation eingezeichnet, es gibt aber keine Felder

    • Zwischen Author und Article ist das eine gerichtete Assoziation, aber nicht eingezeichnet

    • Zwischen Article und Review ist die Richtung der Assoziation falsch eingezeichnet

    • Du hast keine Multiplizitäten (?!)

  • das Passwort ist natürlich gehashed

Diagram

bef(3)

2

02BK aka M

1. Datenmodell

a02 bal cld

  • Schreibweise

    • anstelle von clientID → clientId

  • Benennung

    • anstelle von clientId, nur id,

    • da beim Aufruf

    • Customer wäre wahrscheinlich gebräuchlicher als Client (zu allgemein)

    • addOrderToOrderList ist nicht ok in OrderRepository → besser: addOrder

      • Es muss ja nicht unbedingt eine List sein

      • man gibt keine Implementierungsdetails preis

      • ist unübersichtlich

  • address ist vermutlich nicht atomar (ist aber derweil noch ok)

    Client huber = new Client(...);
    sout(huber.id); (1)
    1 Das Objekt ist sowieso vorangestellt
  • Define one repository per aggregate

    • Repositories sind nur für "starke" Entitäten zu erstellen (Aggregates im microsoft-Sprech)

    • OrderDetails ist eine schwache Entität (kann alleine nicht existieren)

    • Man implementiert hier auch schon (z.T.) die Business-Logik Deine Repos müssen sicherstellen, dass kein OrderItem ohne Order erstellt wird oder dass kein Order gelöscht wird, wenn OrderItems vorhanden sind

a02 andricic entities and repos

  • Die von Dir zurückgegebene Liste ist immutable

public List<Order> getOrderList() {
    return Collections.unmodifiableList(orderList);
}

2. Use-Case-Diagram

  • Use-Cases im Präsens → "send out Orders"

  • Die Tests spiegeln keine Use-Cases wider!!!!!!!!!

3. Dokumentation (README.md)

  • Man könnte auch bestimmte Felder erklären

    • zB totalCosts

4. Automatisierte Tests

  • Es fehlen Tests der Assoziationen → werden diese korrekt gesetzt

  • Ein Test der Setter und Getter ist wohl nicht so wichtig.

  • Wichtig wären:

    • Hinzufügen eines Clients

    • Hinzufügen von Produkten

    • Hinzufügen einer Order

    • Hinzufügen von OrderItems (über OrderRepository)

    • Ändern/Löschen/Stornieren entsprechend den Use-Cases (muss nicht vollständig sein)

bef(3)

3

03BB

1. Datenmodell

a02 besic cld

  • Ein Shop kann nur einen Raum mieten - wirklich?

  • Ein Raum kann nur einmal vermietet werden?

    • Zieht der Mieter aus, kann der Raum nicht mehr vermietet werden.

2. Use-Case-Diagram

a02 besic ucd
  • Deine oberen 4 UCs kann man zu einem (oder zwei) UCs zusammenfassen:

    • Vertrag erstellen

    • Vertrag ändern

3. Automatisierte Tests

  • Du musst @QuarkusTest verwenden, sonst funktioniert @Inject nicht

  • Wir verwenden assertJ oder jUnit, aber ganz sicher nicht import org.wildfly.common.Assert;

    • Es ist sonnenklar, warum Dir bei den Imports kein junit angeboten wurde

      In jUnit gibt es kein Assert …​

      a02 besic import1

      ... sondern ein Assertion

      a02 besic import2

  • Noch komfortabler und vor allem sprechender wäre die Verwendung von assertJ (assertThat)

  • Leider testest auch Du nicht die Use-Cases, sondern "nur" technische Details (v.a. getter und setter)

4. Imports

Wie viele JAckson-Implementierungen brauchst du eigentlich?
<dependencies>
   <dependency>
     <groupId>com.fasterxml.jackson.datatype</groupId>
     <artifactId>jackson-datatype-jsr310</artifactId>
     <version>2.6.5</version>
   </dependency>
    ...
   <dependency>
      <groupId>com.fasterxml.jackson.module</groupId>
      <artifactId>jackson-module-parameter-names</artifactId>
   </dependency>
   <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jdk8</artifactId>
   </dependency>
   <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
   </dependency>
</dependencies>
  • Wenn Du schon unbedingt Jackson verwenden möchtest, dann nimm die Quarkus-Implementierung

  • Du verwendest jsonb und Jackson - eines von beiden reicht

<dependencies>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-jackson</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-jackson</artifactId>
    </dependency>
    ...
</dependencies>

bef(3)

4

04BP

n/a

ngd(5)

5

05BJ

1. Datenmodell Baumschule

Diagram
  • weiss eigentlich nicht, was du genau machen möchtest (?!)

  • Notation:

    • kein snake-case

2. Use-Case-Diagram

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

    • Beschriftung des Systemrahmens

    • UCs bestehen aus einem Verb und einem Substantiv

    • Es geht um Geschäftsprozesse und nicht irgendwelche techn. Inserts oder Updates

gen(4)

6

06BN

1. Datenmodell Kochrezepte

a02 bojer cld
  • Datenmodell im Großen und Ganzen korrekt

  • Der Detaillierungsgrad des Datenmodells bringt eigentlich nichts, außer man möchte die Kalorien/Joule der einzelnen Speisen berechnen.

  • Für die Klasse RecipeIngedients braucht man kein Repository

2. Use-Case-Diagram

a02 bojer ucd

3. Dokumentation

4. Umfang des Projekts

  • JSON-Datei mit Kochrezepten

  • mehrere .http-Dateien

5. Automatisierte Tests

  • Die Packages der Tests sollen denen der getesteten Klassen entsprechen

    • Damit auf package-scoped Elemente zugegriffen werden kann

  • Bei den Tests sind die Use-Cases zu prüfen.

6. Programmierung

  • Gibt es einen Grund, warum Du keine Exceptions verwendest?

gut(2)

7

07EB

1. Datenmodell

a02 ecker cld
  • Dein CLD zeigt eine gerichtete Assoziation von Animal zu Stable.

    • Tatsächlich verweist aber Stable zu Animal (in Form einer List)

  • Der Sinn Deines Datenmodells ist mir derzeit noch nicht zugänglich

2. Automatisierte Tests

  • Nicht alle Tests in einem package - package sollte korrespondierend zu den getesten Klassen sein

ngd(5)

8

08EM

1. Datenmodell

Diagram
  • InvoiceLine (besser InvoiceItem)

    • hat keine Verbindung zu Invoice (auch wenn Invoice eine Verbindung hat, ist das problematisch)

    • es hat keinen Preis. Bei einer Preiserhöhung würden rückwirkend die Umsätze scheinbar steigen

  • Product

    • Welchen Key nimmst Du, wenn es für das Produkt keinen EAN-Code gibt?

2. Use-Case

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

    • Beschriftung des Systemrahmens

  • welche Customer statistic

3. Documentation

  • kein CLD und UCD im README.md

gut(2)

9

09GL

leeres Repo

ngd(5)

10

10HL

1. Datenmodell

Was soll das? Ein Klassendiagramm mit Krähenfußnotation?

a02 hain cld

2. UCD

  • kein UCD vorhanden

3. Dokumentation

  • keine Doku im README.md

4. Programmierung

  • bei Entitäten nur generierte MEthoden

  • ansonsten kein Sinn erkennbar

ngd(5)

11

11HN

  • eventmanager

1. CLass-Diagram

Diagram
  • welchen Zeichensatz verwendest Du? jedenfalls nicht UTF-8

  • Welches Problem möchtest Du lösen?

    • budget in client - das kann nicht sein

    • event hat kein Datum (?)

  • Bitte um Rücksprache in Discord

2. UCD

Diagram
  • Das sind keine Use-Cases

  • UC bestehen aus Verb und Substantiv

    • Was zB soll ein use case "budget" sein,

    • oder ein UC "logout"?

  • nur wenige UCs → GEschäftsprozesse, nicht technische Funktionen

ngd(5)

12

12HT

Diagram
  • Diese CLD ist komplett falsch

  • 3 Stammdatentabellen sind nebeneinder angeordnet

    • Employee verweist auf Customer (Pfeil), hat aber kein entsprechendes Attribut

  • Du musst Dir Deinen Anwendungszweck überlegen, diesen dokumentieren und anschließend modellieren

    • zB Verkauf von Reisen

    • Department scheint mir sinnlos. Die meisten Reisebüros sind so klein, die haben keine Abteilungen

  • Notation

    • <attribute>: <data type>

  • getter und setter in einem CLD tragen nicht zur Übersichtlichkeit bei

1. UCD

Diagram
  • Wichtig sind die UCs, mit denen man "Geld verdient"

  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

    • Beschriftung des Systemrahmens

ngd(5)

13

13ID

1. Datenmodell Music-Label

Diagram
  • Das CLD ist komplett falsch

  • Ein Artist (ev. auch Band) singt Lieder (Song), die auf Schallplatten (Record) released werden.

  • oder es gibt keine Schallplatten/CDs mehr, dann könnte man Vertriebskanäle (youtube,netflix, Radiostationen,…​) modellieren und die Einnahmen dieser

Diagram
  • gar nicht so schlecht. Muss man sich im Detail ansehen

gen(4)

14

14KJ

1. Datenmodell

Diagram
  • Gefragt war eigentlich ein Klassendiagramm, ERD ist aber durchaus ok.

  • ERD sollte aber korrekt sein:

    • Long → NUMBER ev. INT (Long gibt es nicht in SQL, denke ich)

    • String → VARCHAR

    • Double → NUMBER oder FLOAT

  • Vom Inhalt her ist es

2. Use-Case-Diagram

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

    • Es fehlt der komplette Systemrahmen

  • Ein möglicher wichtiger UC wäre wohl eine Auflistung freier Parkplätze

3. Documentation

  • README.md ist mangelhaft

bef(3)

15

15KV

1. Datenmodell

Diagram
  • Eigentlich inhaltlich ziemlich gut

    • Die Rückgabe sollte vermerkt werden

2. Use-Case-Diagram

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

3. Documentation

  • README.md ist minimal, aber man kennt sich aus, was das Problem ist.

gut(2)

16

16ÖMB

  • Dein Projekt befindet sich nicht im Root des Repos

1. Datenmodell

a02 oezdogan cld
  • Dein Datenmodell passt überhaupt nicht

  • Es ist eine Ansammlung von Stammdaten-Klassen, es fehlen Klassen für die Bewegungsdaten

    • zB Geräte und Erstellung von Trainingsprogrammen

  • Dein UCD und Dein CLD passen überhaupt nicht zusammen, dh die Use-Cases können vom Datenmodell nicht durchgeführt werden.

1.1. UCD

a02 oezdogan ucd
  • Was soll das Package "Professional"?

  • Beschriftung des Systemrahmens !!!!

  • Du hast UC’s "Drink" und "Take Shower". Hast Du eine Brause in Dein System eingebaut?

2. Automatisierte Tests

  • Deine Tests sollen sich im selben Package wie das Testobjekt befinden.

gen-(4-)

17

17PMa

1. Datenmodell

Das reicht wohl nicht - ein eigenes CLD war verlangt

a02 plakolb cld

a02 plakolb cld generiert
Figure 1. Das tatsächliche CLD
  • Es fehlen die Assoziatonen

  • Die Entitäten sind isoliert und haben einerlei Bezug zueinander.

2. User-Stories

  • fehlen

3. Dokumentation

  • keine Dokumentation in README.md

4. Automatisierte Tests

@Test
void getCompanyIdTest() {
    Long expected = 1L;
    assertThat(expected).isEqualTo(company.getId());
}

5. Fazit

  • Es sind wesentliche Teile der Angabe nicht erfüllt.

  • Die idente Widerholung von Entitäten und Tests reicht nicht.

ngd(5)

18

18PMo

1. Datenmodell

Diagram
  • Was soll das sein? Ein Klassendiagramm?

  • Date als String, wirklich?

  • Calculation bedeutet aber nicht Rechnung i.S.v. Ausgangsrechnung!

  • Eine Calculation ist auf einem Car?

Diagram
Figure 2. korrigiert

2. Use-Case-Diagram

Diagram
  • Grundsätzlich ok

  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

3. Documentation

README.md ist spartanisch, aber durchaus aussagekräftig

gen(4)

19

19RY

leeres Projekt abgegeben

ngd(5)

20

20RR

Man kann das Projekttitel auch ändern

rajkovaca project title

1. Datenmodell

Diagram
  • Diese CLD kann nicht funktionieren:

    • Das ist einen Aneinanderreihung von Stammdaten-Tabellen

    • Besser wäre die Verwendung von Bewegungsdaten

  • Die Table Restaurant beinhaltet nur eine Zeile

1.1. Vorschlag

Diagram
  • Bei Restaurants wird selten eine Tabelle der Kunden geführt. Es werden eher der Namen und die TelNr der reservierenden Person in der Reservierung vermerkt.

2. Use-Case-Diagram

Diagram
  • Was bedeutet der UC "look after customers"? Kann man in Deinem System nachschauen, wie es den Gästen geht?

  • Unter Product versteht man Dishes und Beverages.

3. Documentation

README.md ist kurz, aber das Problem ist ausreichend beschrieben

ngd(5)

21

21RF

1. Datenmodell

Diagram
  • Die Bill (besser Invoice) ist eigentlich schon die assoziative Tabelle der : - Relation zwischen Jewelery (besser Produkt) und Customer

  • Deine Invoice funktioniert nicht. Es fehlt die Rechnungsposition, damit man auf einer Rechnung mehrere Produkte kaufen kann.

  • Jewellery

2. Use-Case-Diagram

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

    • Beschriftung des Systemrahmens

  • "Gets Bill" ist kein sol toller UC, oder?

ngd(5)

22

22SE

1. Datenmodell

a02 sljivic cld
  • Die Rekursion beim BusStop ist wahrscheinlich nicht ok.

    • Was wäre wenn ein BusStop mehrere nachfolgende BusStops hat (zB an einer Kreuzung mehrerer Linien)

  • Vielleicht wäre es sinnvoll, nur die Linien und die Abfahrtszeiten zu modellieren und nicht den Dienstplan der Fahrer

2. UCD

a02 sljivic ucd
  • Glaubst Du wirklich, der Gast erbt sämtliche Rechte des Admins? - Hoffentlich nicht

3. Automatisierte Tests

  • Warum hat Dein Test-Verzeichnis keinen Java-Ordner?

  • Du solltest bei den Tests auf die User-Stories Bezug nehmen

    • Getter und Setter sind eigentlich sinnlos zu testen, außer es ist irgendeine zusätzliche Logik enthalten

    • equals() und hashCode() schon. Sollte dann dokumentiert werden

      • Was sind idente Objekte (welche Attribute werden dabei berücksichtigt)

4. Programmierung

Warum hast Du einen Rückgabewert, wenn Du ihn nie benutzt?

a02 sljivic return never used

wenn möglich, final wählen

a02 sljivic final

gut(2)

23

23SB

1. Datenmodell

a02 spasenovic cld
Figure 3. Notation falsch (das ist ja kein Programmcode, sondern ein CLD)
a02 spasenovic cld korr
Figure 4. teilweise korrigiert
  • Die Kosten sind eher kein Integer.

  • Wir verwenden kein Date, sondern LocalDate.

  • id ist (fast) immer Datentyp Long. Id hier noch nicht notwendig.

  • Da es hier keine Datenbank gibt, ist eine Id in den Entities nicht notwendig.

    • Notwendig wäre aber eine equals()-Methode und eine hashCode()-Methode (es gibt ja keinen Primärschüssel)

  • Wieso heisst Dein package boundaryTest und nicht boundary?

  • Ganz böse - Du verletzt das Prinzip der Kapselung

    public List<Car> getCars() {
            return this.cars; (1)
        }
    1 Man hat Zugriff auf die Liste und kann alles verändern.
    public List<Car> getCars() {
            return Collections.unmodifiableList(cars); (1)
        }
    1 Nun ist die Liste immutable

2. Automatisierte Tests

  • Es fehlen Modultests (nur Entities)

gen(4)

24

24SP

1. Datenmodell

Diagram
  • Das ist nur ein Klassendiagrammfragment

2. Use-Case-Diagram

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

    • Beschriftung des Systemrahmens

    • UCs sind keine UCs (Verb + Substantiv). So haben Deine UCs keine Aussagekraft

3. Documentation

Gesamtüberblich beim README.md fehlt

ngd(5)

25

25TF

1. Datenmodell

Diagram
  • id → Long (kein Primitivdatentyp)

  • Mache Klassen haben eine Id, ander nicht → das ist nicht konsistent

  • Die Notation ist falsch: Was bedeutet "has 1"?

1.1. korrigiert

  • Bei deinem CLD kann ein Buch nur einen Auto haben (das ist nicht sehr realistisch)

  • Die Nationalität als Sting ist wohl sehr nachteilig.

  • Die noOfBooks wird nicht als Zahl eingetragfen, sondern bei Bedarf aus den publizierten Büchern berechnet

  • Eigentlich ist diese Korrektur sinnlos, da Du das Problem nicht ordentlich spezifiziert hast.

Diagram

2. Use-Case-Diagram

Diagram
  • Der UC "Rent Book" ist im Datenmodell nicht abgebildet

3. Documentation

  • Aus deinem README-File geht nicht hervor, was Du für ein Problem lösen möchtest

ngd(5)

26

26TP

n/a

1. Datenmodell

Diagram
  • wieviele Grabsteine ein Grab hat, spielt für den Friedhofbetreiber wohl keine Rolle

  • Kunden (Customer) können für eine gewisse Dauer entweder Gräber oder Urnengräber mieten

  • Diese Grabstellen können Bereichen zugeordnet werden, in den Gräber nur einer Religionsgemeinschaft zu finden sind

  • Es muss ersichtlich sein, welche Grabstellen sind verfügbar und welche Grabstellen sicn noch für wie lange vermietet.

2. Use-Case-Diagram

Diagram
  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

3. Documentation

In der README.md ist nicht ersichtlich, welches Problem zu lösen ist

ngd(5)

27

27WM

1. Datenmodell

Diagram
  • Was soll das für ein Call-Center sein?

  • Ein Call-Center hat Kunden

    • Für diese Kunden werden zu gewissen Themen für eine gewisse Dauer Anfragen abgewickelt

    • Es geht wahrscheinlich nicht einmal so ums tracken der calls

  • Auch das vorhandene minimale CLD stimmt nicht

    • Du speicherst die Anrufer

      • Aber diese sind nicht identifizierbar

      • Wenn drei Franz Mayr anrufen, würden diese bei Die dieselbe Person sein

      • Das ist ganz schlecht, das ist nicht nur Scheingenauigkeit, sondern spiegelt eine falsche Realität wider.

Diagram
  • Auch eine Telefonnummer ist kein eindeutiges Identifikationskriterium

  • "See call duration" - kein besonders ansprechender Geschäftsprozess

  • falsche Notation

    • Assoziationen haben keine Pfeilspitzen

ngd(5)

Kriterien
Allgemeine Bemerkungen

1. 2020-12-10

2. 2020-12-14

2.1. JPA mit Panache (Demo-Projekt)

3. 2020-12-21

4. 2021-01-07 - Bidirektionale Beziehungen

Begriffe: Multiplizität, Kardinalität, referentielle Integrität, cascading (PERSIST,MERGE,REMOVE,…​ )

Übung Hobby (live-coding)

4.1. Persistieren von Klassen in die DB

  • in pom.xml die Abhängigkeiten (Libraries) eintragen

    • JPA

    • JDBC-Driver

  • Vorbereiten der Klassen

    • @Entity

    • @Id @GeneratedValue

    • Annotationen für Assoziationen eintragen

  • Datenbank-JDBC-Url in application.properties eintragen

  • Repositories erstellen

Übung: * Persistieren Sie die Tabellen PErson und Hobby in der Datenbank Hobby: PK String abbr Person: PK Long id * Erstellen Sie Tests mit assertJ-DB, um die Korrektheit der Klassen sicherzustellen ** @QuarkusTest nicht vergessen * Tipp: https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

5. 2021-01-11

5.1. Allgemeine Fehlerbehebungs- bzw Fehlervermeidungsmaßnahmen

5.1.1. Feedback beachten

  • werden Kommentare zu erstellten Arbeiten zur Verfügung gestellt, so ist es wichtig, nicht nur seine eigenen Fehler anzusehen, sondern auch die der anderen

  • sehr oft wiederholen sich Fehler und Versäumnisse in vielen Arbeiten

5.1.2. Angabe lesen

  • Die Angabe hat mehrere Komponenten

    • Angabe.pdf (der traditionelle Angabezettel)

    • Kommentare über Klassen und Methoden

      • Falls man diese nicht versteht, darf und sollte gefragt werden

    • die automatisierten Tests

      • hier kann man ersehen, wie die Methoden benutzt werden und was abgeprüft wird (assert)

5.1.3. Das Datenmodell ist als Erstes zu generieren

  • Zuerst soll die Erstellung des Datenmodells funktionieren

    • Entity-Tests durchführen, damit die Entities soweit funktionieren

    • Entities persistenzfähig machen

    • Repositories persistenzfähig machen → @ApplicationScoped ist bei allen Repos einzutragen

5.1.4. Definierten Ausgangszustand herstellen

wird auch AEG genannt: Ausgeschaltet-Eingeschaltet-Geht

  • darunter fällt das manuelle Löschen der Tabellen (solange dieses nicht nicht korrekt ist)

  • das Löschen des target Ordners bei "komischen" Fehlermeldungen zB java: cannot find symbol

    • wird der target Ordner nicht gelöscht, können Codedteien vom letzten Kompiliervorgang bestehen bleiben und die Funktionsfähigkeit beeinträchtigen

    • Dies ist besonders bei Tests wichtig, da beim normalen Start mit mvnw meist clean verwendet wird, wodurch der trget-Ordner gelöscht wird

      • man könnte beim Aufruf der Tests ebenfalls ein CLEAN eintragen - somit würde der target-Ordner automatisch gelöscht

5.1.5. DROP TABLE manually

  • Solange das Datenmodell noch nicht korrekt ist, ist es angeraten, die Tabellen per DROP manuell zu löschen

    • dh insbesondere Tabellenbezeichnungen sind noch nicht korrekt

    • oder zusätzliche Tabellen wurde automatisch erstellt (zB assoziative Tabellen, weil mappedBy fehlt)

  • Grund hierfür ist die referentielle Integrität. Diese kann verhindern, dass eine Tabelle mit DROP TABLE (automtisch) gelöscht wird, weil eine referntielle Beziehung zwischen diesen Tabellen besteht

5.1.6. Code strukturieren

  • Zeilenschaltungen verwenden

  • Code einrücken

5.1.7. Die Unterstützung der IDE verwenden

  • Debugger verwenden

  • Basic Code Completion (AutoComplete) verwenden (Strg + Leertaste)

  • Smart Code Completion verwenden (Ctrl + Shft + Leertaste)

  • Refactoring (Strg + T) zB beim Umbenennen von Variablen/Methoden

  • …​

  • Keymap Referenz unter Hilfe ansehen

5.1.8. (Zwischen-)Ergebnisse kontrollieren

  • Es ist wichtig die Ergebnisse der Methoden und Codefragmente zu kontrollieren.

  • Die Annahme, dass der Code schon funktionieren wird, ist nicht zulässig. Das ist wie programmieren mit Augenbinde.

  • Entweder

    • wird der Debugger verwendet (die vorzuziehende Vorgehensweise)

    • oder mit logging- oder println-Ausgaben wird das Ergebnis kontrolliert (eher nur in Ausnahmefällen verwenden)

  • Dies ist der Grund, warum wir eine professionelle IDE verwenden und nicht irgendeinen Code-Editor

5.1.9. Verbesserung sauber ausarbeiten

  • Eine Verbesserung der Arbeit ist hauptsächlich dazu da, die eigenen Fehler zu reflektieren

    • Ihr macht Sie nicht für den Lehrer

    • Im besten Fall dient Eure Verbesserung (Beschreibung der Fehler und die Maßnahmen zur Korrektur) beim nächsten Test als Grundlage

    • Die Erstellung eines pdf-Dokuments soll es Euch ermöglichen auch vor dem nächsten Test noch mal Eure Fehler durchzugehen und nicht in x Codestellen in vielleicht mehreren Projekten zusammenzusuchen

Nach einer Arbeit ist grundsätzlich von jedem eine Verbesserung durchzuführen, nicht nur von Personen mit negativer Note!!!

6. 2021-02-01 - Kotlin Einführung

  • Foliensatz: Kotlin-Grundlagen

7. 2021-02-04: Kotlin und Funktional

8. 2021-02-22: Kotlin und OO

9. 2021-03-01

jetpack

jetpack compose

Gr. 1: ab extension methods

10. 2021-03-08

  • recyclerview

11. 2021-03-15

  • Vereinbarung: Für das nächste Mal wird probeweise eine RecyclerView im Rahmen des Microprojekts erstellt

    • mit mehreren Feldern

  • Falls es eine LZK gibt, dann keine RecyclerView

12. 2021-03-18

  • Übung

    • Classroom: https://classroom.github.com/a/IKBe6iXb

    • Ausgangspunkt ist das Mikroprojekt

    • Es ist eine Liste mit RecyclerView in Android zu erstellen

    • Die Commits-Messages müssen mit dem Nachnamen beginnen.

    • Diese Übung ist Grundlage für LZK-Gespräche

    • Im README.md ist kurz das Projektthema und die Implementierung zu beschreiben

    • In der ORacle VM ist ein Quarkus-Restful-Service zu erstellen (mit automatisierter Pipeline)

13. 2021-03-18

14. 2021-03-22

14.1. Android Fragments

14.2. Android Navigation

  • fertigstellen des Tutorials Navigation bis Donnerstag 25.3.

  • bis nach den Osterferien mindestens bis inklusive Persistence

15. 2021-05-03

15.1. Android Room

16. 2021-05-06

applicationserver vs microprofile

17. 2021-05-10

  • work/android.4ahif/RoomApp4ahifGrA

  • work/android.4ahif/RoomApp4ahifGrB

18. 2021-05-17

Room - Bsp bis inkl. Navigation

19. 2021-05-20

19.1. Internationalization (I18N)

  • Internationalisierung bedeutet, ein Programm so zu gestalten, dass es leicht (ohne den Quellcode ändern zu müssen) an andere Sprachen angepasst werden kann.

  • Grundprinzip von I18N

    • Es gibt key-value Paare. Der key wird in das Programm eingetragen. Im Value steht der Ausdruck in der jeweiligen Sprache.

    • Um mehrere Sprachen verwenden zu können werden entweder

      • die Ressourcen - Dateien mit Spachenkennzeichen versehen

      • oder die Verzeichnisse, die diese Dateien beinhalten

  • Beispiel in Java

19.2. Room-Tutorial

bis "7. Implement the AddFragment"

20. Konkretisierung der Angabe für das Mikroprojekt

  • Das Microprojekt besteht aus zwei Teilen:

    • Backend (Quarkus / JakartaEE)

    • Frontend (Android)

    • Erstellen sie im Repo ein Quarkus Projekt mit Namen backend

    • Später erstellen Sie ein Android-Projekt mit Namen mobile

  • Zuerst ist das Backend sauber zu erstellen (Ordner backend im Repository)

    • Die Tabellen und deren Assoziationen müssen korrekt sein und mind. der 3.NF entsprechen

    • Es sind Endpoints zu erstellen:

      • Bei den Endpoints dürfen nicht nur die Daten jeweils einer Entität (Tabelle) zurückgegeben werden, sondern es ist mindestens eine Query zu erstellen, die aus mehreren Tabellen Daten zurück gibt.

      • Auch sind die Werte zu filtern:

        • zumindest einmal mit QueryParams

        • zumindest einmal mit PathParams

      • Mindestens ein Endpoint muss

        • einen GET-Request

        • einen POST-Request

          • einmal mit nur einem Objekt und

          • einmal mit mehreren Objekten

        • einen PUT-Request

        • einen PATCH-Request

        • und einen DELETE-Request beinhalten

    • Es ist zumindest ein request.http - File im http-requests - Ordner zu erstellen, damit die Abfrage der Endpoints dokumentiert ist

    • In der README.md ist eine sehr rudimentäre Dokumentation enthalten:

      • Datenmodell

      • Use-Case mit UCD: Es sind spezielle Use-Cases für das jeweilige Thema zu implementieren

        • zB für ein Kino die Sitzreservierung bei Filmen

        • es darf nicht für jede Themenstellung eine User-, Kunden- oder sonstige Verwaltung durchgeführt werden, die bei sämtlichen Themenstellungen ident ist.

      • Infos über die Endpoints - dies kann und soll durch einen Swagger ersetzt werden → Link auf Swagger angeben

      • Die Default-Swagger-Infos können und sollen durch Annotationen ergänzt werden.

      • Die Angabe soll als Checkliste angegeben sein, damit auf einen Blick ersichtlich ist, was gemacht wurde.

      • Wie startet man das Projekt.

Es geht grundsätzlich nicht darum, dass alle Endpoints (dh für alle Entitäten) vollständig ausprogrmmiert werden. Allerdings sind die verschiedenen Konzepte (Queries, Params, Request-Arten, POSTs mit einem und mehreren Objekten als csv oder json) einmal zu implementieren.
  • Das Frontend wird später erstellt (Termin wird nooch vereinbart)

  • Abgabetermin: 26. Mai 2021, 8:00

  • Als Repo wird 14-microproject verwendet

21. Exkurs: Parameter in JAX-RS

22. 2021-06-10 (Do.)

22.2. Jakarta EE (Wiederholung vom 6.Mai)

Software Development in Jakarta EE

jakarta ee dev process


jakarta ee application server

22.3. MicroProfile (Wdhlg vom Anfang des Jahres)

MicroProfile ist eine Auswahl von Jakarta EE Spezifikationen (DI, JPA, JAX-RS, …​), ergänzt um weitere Specs (Health, Fault Tolerance, Metrics, …​).

  • Dabei wird kein separater Application Server verwendet.

  • MicroProfile ist für cloud computing optimiert

applicationserver vs microprofile