Der Alltag eines Entwicklers ist oftmals geprägt von sich immer wiederholenden Entwurfsmustern. Möchte man beispielsweise eine REST-Schnittstelle für persistente Datenobjekte entwickeln muss man zunächst die gewünschten Entitäten definieren. Anschließend sorgt man ggf. mit Repository-Klassen dafür, dass diese Objekte auch persistieren. Zu guter Letzt implementiert man noch die Ressourcen bzw. Endpunkte, die diese Daten nach außen bringen bzw. von dort annehmen können.
Es wäre doch schön, wenn man sich einige dieser Schritte sparen könnte und es einen automatisierten Weg gäbe, der mir diese Arbeiten abnimmt. Mit Hilfe von Quarkus und Panache ist genau das möglich. In diesem Blog Beitrag möchte ich euch das einmal anhand eines einfachen Beispiels zeigen.
Entitäten definieren
Was uns durch keinen Automatismus abgenommen werden kann ist natürlich die Definition unserer Entität. Diese können wir mit Hilfe von Jakarta Persistence (Hibernate) wie folgt definieren:
@Getter
@Setter
@Entity
public class Participant extends PanacheEntityBase {
@Id
private Long id;
private String name;
@Enumerated(EnumType.STRING)
private Level level;
}
Wir benutzen an dieser Stelle Lombok um uns Getter- und Setter-Methoden sparen zu können. Darüber hinaus sollten die Methoden equals und hashcode natürlich JPA-konform definiert werden.
Repository anlegen
Panache bietet die Möglichkeit zwei Ansätze für den Zugriff auf die Entitäten einzusetzen. Zum Einen das Active Record Pattern und zum Anderen das Repository Pattern. Ich habe mich an dieser Stelle für Letzteres entschieden, womit es notwendig wird eine Repository Klasse zu definieren.
@ApplicationScoped
public class ParticipantRepository implements PanacheRepository<Participant> {
}
Panache liefert uns an dieser Stelle bereits die grundlegenden CRUD-Methoden mit. Diese könnten wir nun einsetzen um in einem Rest-Endpunkt die Zugriffe zu implementieren.
Endpunkt erzeugen
Damit Panache uns automatisiert unseren Endpunkt erzeugen kann, müssen wir lediglich ein entsprechendes Interface anlegen und mit unserer Repository-Klasse „verbinden“.
@ApplicationScoped
public interface ParticipantResource extends PanacheRepositoryResource<ParticipantRepository, Participant, Long> {
}
Anschließend stehen uns die üblichen Methoden zum Zugriff auf die Ressource zur verfügung. Eine Liste aller Einträge lässt sich bspw. über folgenden Aufruf abrufen.
$ curl http://localhost:8080/participant -H "Accept: application/json"
Darüber hinaus gibt es noch weitere nützliche Parameter, die man bei dem Aufruf mitgeben kann. Mit size kann man die Anzahl der gleichzeitig zurückgelieferten Elemente bestimmen. Auch eine Paginierung ist bereits vorhanden. Für weitere Informationen sei auf die Quarkus-Dokumentation verwiesen.
Neben der Nutzung von Hibernate bzw. Jakarta Persistence lässt sich ebenfalls eine MongoDB zur Speicherung der Daten nutzen.
Das Beispiel haben wir wie immer auf Github abgelegt.