1. Dependecies

  • hibernate-orm-panache

  • resteasy

  • resteasy-jsonb

  • jdbc-derby

  • smallrye-graphql

  • smallrye-openapi

1.1. Testen

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.21.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-db</artifactId>
    <version>2.0.2</version>
    <scope>test</scope>
</dependency>

2. Start Methode

Über die Klasse die Annotation

  • @ApplicationScoped

In der der Methode Init Parameter StartupEvent mit @Observes

3. Derby db ohne datasource.txt

db

4. Embedded Id

In der Klasse die, die Referenzen auf 2 Klassen hat (Assotiation Tabelle)

@EmbededId
EmbededIdClass id;

Eigene Klasse für die Referenzen erstellen (EmbededIdClass)

  • Implements Serializable

  • Über die Klasse @Embeddable

  • Die Referenzen mit @ManyToOne

Beim Post die Schlüssel der Referenzen und die Daten mitgeben (DTO, PathParam, JsonObject)

5. Sequence

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Name der Folge")

@SequenceGenerator(name = "Name der Folge", initialValue = 1000)

6. Repositories mit Panache

  • PanacheRepository<Entity>

  • PanacheRepositoryBase<Entity, Id> wenn der Schüssel etwas anderes als Long ist

7. Json

JsonObject jsonObject = Json.createObjectBuilder().add(name,value).build()

kann einem Json-Array hinzugefügt werden

7.1. Auslesen aus einem JsonObject

object.getString("name");
object.getInt("name");

7.2. Auslesen aus einem JsonArray

JsonArray array = jsonObject.getJsonArray("person");
array.asJsonObject().getString("firstName");

8. Route zurück geben

  1. Als Parameter @Context UriInfo uriInfo

  2. UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder() .path(survey1.getId().toString());

  3. Response.created(uriBuilder.build()).build();

9. GraphQL

9.1. GET

@GraphQlApi bei Resource

Methoden mit @Query("nameDerQuery")

Aufruf:

query customersLnFnId{
  allCustomers{
    id
    firstName
    lastName
  }
}

customersLnFnId = Name den man in der History sieht kann beliebig gewählt werden

9.1.1. Mit Parameter

Aufruf:

query customersLnFnId{
    getCustomer(id: 5){
        firstName
        lastName
    }
}

Resource Methode muss mit @Name("id") im Parameter stehen haben

Default Wert mit @DefaultValue("Mustermann")

Wenn die Methode ohne Parameter aufgerufen wird darf man keine runden Klammern schreiben

query customersLn{
    getCustomerByLastName{
        id
        firstName
        lastName
    }
}

9.2. POST

@Mutation("name") über Methode

Aufruf:

mutation addCustomer{
    createCsutomer(customer: {
        fn: "Max"
        ln: "Mustermann"
    })
    {
        id
    }
}

9.3. Delete

Wie bei Post nur wird eine Id mitgegeben statt ein Objekt

9.5. Sonstiges

Bei einer Mutation Methode muss ein Wert zurück gegeben werden
Bei Mutation Methoden braucht man kein @Name

9.6. Context

Kann Injected oder als Parameter mitgegeben werden

@Inject
Context context;

Möglichkeiten wie bei UriInfo in REST

siehe "Route zürück geben"

9.7. Fehler

Fehler Klasse erstellen

@ErrorCode("price too high")
public class PriceTooHighException extends Exception {
    @Override
    public String getMessage() {
    return "Price too high";
    }
}

Bei der Methode muss throws PriceTooHighException dabei sein.

if(room.getPricePerDay().intValue() > 100){
    throw new PriceToHighException();
}

10. Date

10.1. Differenz zwischen zwei Daten

ChronoUnit.DAYS.between(dateFrom, dateTo);

10.2. Tage zu einem Datum hinzufügen/entfernen

LocalDate.now().plusDays(1);
LocalDate.now().minusDays(1);

11. CSV Einlesen

11.1. Zeilen lesen

Stream<String> lines = Files.lines(Paths.get(fileName));

11.2. Skip

this.ccno = lines.skip(2).findFirst().get().substring(6);

Bei Skip kann ein Fehler auftauchen (IllegalStateException: stream has already been operated upon or closed) dann muss die Datei erneut aufgemacht werden:

lines = Files.lines(Paths.get(fileName));

11.3. Daten Speichern

lines.forEach(line -> {
    String[] cols = line.split(";");
    Customer customer = new Customer(cols[0], cols[1], ccno);
});

12. Sonstige Tipps

  • application.properties

  • ToString Methode in den Entitäts Klassen

  • @ApplicationScoped im Main und Repos

  • JoinColumn für Referenzen auf andere Klassen

  • Bei Rest Schnittstellen Responses zurück geben

  • Bei einem Post keine id mitgeben sonst bekommt den Fehler "detached entity passed to persist"

  • Methoden mit Berechnungen in Klassen

  • Wenn im application.properties

    quarkus.http.root-path=/api

dann muss man bei Swagger und GraphQl /api hinzufügen