Øvelse – Opprett et Quarkus-program
I denne enheten oppretter du et grunnleggende Quarkus-program. Du bruker Maven til å starte programmet og et integrert utviklingsmiljø (IDE) etter eget valg for å redigere koden. Bruk en terminal du ønsker for å kjøre koden. Du bruker Docker til å starte en lokal PostgreSQL-database, slik at du kan kjøre og teste programmet lokalt.
Generer Quarkus-programmet ved hjelp av Maven
Det finnes flere måter å generere en Quarkus-prosjektstruktur på. Du kan bruke Quarkus-nettgrensesnittet, en IDE-plugin-modul eller Quarkus Maven-plugin-modulen. La oss bruke Maven-plugin-modulen til å generere prosjektstrukturen.
Du genererer programmet med flere avhengigheter:
- Den
resteasyavhengigheten for å vise et REST-endepunkt - Den
jacksonavhengigheten for å serialisere og deserialisere JSON - Den
hibernateavhengigheten for å samhandle med databasen - Den
postgresqlavhengigheten for å koble til PostgreSQL-databasen - Den
dockeravhengigheten for å bygge et Docker-bilde
Du trenger ikke å angi Azure-avhengigheter fordi du kjører programmet lokalt først og deretter distribuerer en beholderversjon av det til Azure Container Apps.
Generer to-do-programmet ved en ledetekst:
mvn -U io.quarkus:quarkus-maven-plugin:3.19.0:create \
-DplatformVersion=3.18.4 \
-DprojectGroupId=com.example.demo \
-DprojectArtifactId=todo \
-DclassName="com.example.demo.TodoResource" \
-Dpath="/api/todos" \
-DjavaVersion=17 \
-Dextensions="resteasy-jackson, hibernate-orm-panache, jdbc-postgresql, docker"
Denne kommandoen oppretter et nytt Quarkus-prosjekt. Den genererer en Maven-katalogstruktur (src/main/java for kildekode og src/test/java for tester). Det oppretter noen Java-klasser, noen tester og noen Dockerfiles. Det genererer også en pom.xml fil med alle nødvendige avhengigheter (dvalemodus, RESTEasy, Jackson, PostgreSQL og Docker):
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-container-image-docker</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Notat
Alle avhengighetene i pom.xml filen er definert i kvarkusstykklisten (stykkliste) io.quarkus.platform:quarkus-bom.
Kode programmet
Deretter gir du den genererte MyEntity.java klassen nytt navn til Todo.java (plassert i samme mappe som TodoResource.java-filen). Erstatt den eksisterende koden med følgende Java-kode. Den bruker Java Persistence API (jakarta.persistence.* pakke) til å lagre og hente data fra PostgreSQL-serveren. Den bruker også Hibernate ORM med Panache (arver fra io.quarkus.hibernate.orm.panache.PanacheEntity) for å forenkle vedvarende lag.
Du bruker en JPA-enhet (@Entity) til å tilordne Java Todo-objektet direkte til PostgreSQL-Todo-tabellen. Det TodoResource REST-endepunktet oppretter deretter en ny Todo enhetsklasse og opprettholder den. Denne klassen er en domenemodell som er tilordnet Todo tabellen. Tabellen opprettes automatisk av JPA.
Hvis du utvider PanacheEntity får du en rekke generiske metoder for oppretting, lesing, oppdatering og sletting (CRUD) for typen din. Så du kan gjøre ting som å lagre og slette Todo objekter i bare én linje med Java-kode.
Legg til følgende kode i Todo-enheten:
package com.example.demo;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;
import java.time.Instant;
@Entity
public class Todo extends PanacheEntity {
public String description;
public String details;
public boolean done;
public Instant createdAt = Instant.now();
@Override
public String toString() {
return "Todo{" +
"id=" + id + '\'' +
", description='" + description + '\'' +
", details='" + details + '\'' +
", done=" + done +
", createdAt=" + createdAt +
'}';
}
}
Hvis du vil administrere denne klassen, kan du oppdatere TodoResource slik at den kan publisere REST-grensesnitt for å lagre og hente data ved hjelp av HTTP. Åpne TodoResource-klassen, og erstatt koden med følgende:
package com.example.demo;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriBuilder;
import jakarta.ws.rs.core.UriInfo;
import org.jboss.logging.Logger;
import java.util.List;
@Path("/api/todos")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public class TodoResource {
@Inject
Logger logger;
@Inject
UriInfo uriInfo;
@POST
@Transactional
public Response createTodo(Todo todo) {
logger.info("Creating todo: " + todo);
Todo.persist(todo);
UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder().path(todo.id.toString());
return Response.created(uriBuilder.build()).entity(todo).build();
}
@GET
public List<Todo> getTodos() {
logger.info("Getting all todos");
return Todo.listAll();
}
}
Kjør programmet
Når du kjører programmet i utviklingsmodus, må Docker kjøre. Det er fordi Quarkus oppdager at du trenger en PostgreSQL-database (på grunn av PostgreSQL-avhengigheten quarkus-jdbc-postgresql deklarert i pom.xml-filen), laster ned PostgreSQL Docker-bildet og starter en beholder med databasen. Deretter opprettes den Todo tabellen i databasen automatisk.
Kontroller at Docker kjører lokalt på maskinen og kjører to-do programmet ved hjelp av denne kommandoen:
cd todo
./mvnw quarkus:dev # On Mac or Linux
mvnw.cmd quarkus:dev # On Windows
Quarkus-programmet skal starte og koble til databasen. Du skal se følgende utdata:
2025-02-28 08:38:33,418 INFO [io.qua.dat.dep.dev.DevServicesDatasourceProcessor] (build-28) Dev Services for default datasource (postgresql) started - container ID is ce37977203b0
2025-02-28 08:38:33,421 INFO [io.qua.hib.orm.dep.dev.HibernateOrmDevServicesProcessor] (build-6) Setting quarkus.hibernate-orm.database.generation=drop-and-create to initialize Dev Services managed database
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2025-02-28 08:38:35,278 INFO [io.quarkus] (Quarkus Main Thread) todo 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.18.4) started in 5.367s. Listening on: http://localhost:8080
2025-02-28 08:38:35,280 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2025-02-28 08:38:35,280 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, jdbc-postgresql, narayana-jta, resteasy, resteasy-jackson, smallrye-context-propagation, vertx]
--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
Hvis du vil teste programmet, kan du bruke cURL.
Opprett et nytt to-do element i databasen med følgende kommando i en separat terminal. Du bør se loggen i Quarkus-konsollen:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done": "true"}' \
http://127.0.0.1:8080/api/todos
Denne kommandoen skal returnere det opprettede elementet (med en identifikator):
{"id":1,"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done":true,"createdAt":"2025-02-26T07:27:30.093447Z"}
Opprett en ny to-do ved hjelp av følgende cURL-kommando:
curl --header "Content-Type: application/json" \
--request POST \
--data '{"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done": "false"}' \
http://127.0.0.1:8080/api/todos
Deretter henter du dataene ved hjelp av en ny cURL-forespørsel:
curl http://127.0.0.1:8080/api/todos
Denne kommandoen returnerer listen over to-do elementer, inkludert elementene du opprettet:
[
{"id":1,"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done":true},
{"id":2,"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done":false}
]
Test programmet
Hvis du vil teste programmet, kan du bruke den eksisterende TodoResourceTest klassen. Den må teste REST-endepunktet. Hvis du vil teste endepunktet, bruker det RESTAssured. Erstatt kode i TodoResourceTest-klassen med følgende kode:
package com.example.demo;
import io.quarkus.test.junit.QuarkusTest;
import static io.restassured.RestAssured.given;
import static jakarta.ws.rs.core.HttpHeaders.CONTENT_TYPE;
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
import org.junit.jupiter.api.Test;
@QuarkusTest
class TodoResourceTest {
@Test
void shouldGetAllTodos() {
given()
.when().get("/api/todos")
.then()
.statusCode(200);
}
@Test
void shouldCreateATodo() {
Todo todo = new Todo();
todo.description = "Take Quarkus MS Learn";
todo.details = "Take the MS Learn on deploying Quarkus to Azure Container Apps";
todo.done = true;
given().body(todo)
.header(CONTENT_TYPE, APPLICATION_JSON)
.when().post("/api/todos")
.then()
.statusCode(201);
}
}
Når du tester programmet, må Docker Desktop kjøre fordi Quarkus oppdager at den trenger PostgreSQL-databasen for testing. Test programmet ved hjelp av denne kommandoen:
./mvnw clean test # On Mac or Linux
mvnw.cmd clean test # On Windows
Du bør se utdata som ligner på dette:
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.demo.TodoResourceTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------