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

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
-
Als Parameter @Context UriInfo uriInfo
-
UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder() .path(survey1.getId().toString());
-
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