Cvičení – vytvoření aplikace Quarkus
V této lekci vytvoříte základní aplikaci Quarkus. Maven slouží ke spuštění aplikace a integrovaného vývojového prostředí (IDE) podle vašeho výběru k úpravě kódu. Ke spuštění kódu použijte terminál podle vašeho výběru. Pomocí Dockeru spustíte místní databázi PostgreSQL, abyste mohli aplikaci spustit a otestovat místně.
Generování aplikace Quarkus pomocí Mavenu
Existuje několik způsobů, jak vygenerovat strukturu projektu Quarkus. Můžete použít webové rozhraní Quarkus, plugin IDE nebo plugin Quarkus Maven. K vygenerování struktury projektu použijeme modul plug-in Maven.
Vygenerujete aplikaci s několika závislostmi:
- Závislost
resteasy
pro zpřístupnění REST endpointu - Závislost
jackson
pro serializaci a deserializaci JSON. - Závislost
hibernate
pro interakci s databází - Závislost
postgresql
pro připojení k databázi PostgreSQL - Závislost
docker
pro sestavení Docker image
Závislosti Azure nemusíte zadávat, protože aplikaci spouštíte místně a pak nasadíte kontejnerizovanou verzi do Azure Container Apps.
Na příkazovém řádku vygenerujte aplikaci to-do:
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"
Tento příkaz vytvoří nový projekt Quarkus. Generuje adresářovou strukturu Maven (src/main/java
pro zdrojový kód a src/test/java
pro testy). Vytvoří některé třídy Java, některé testy a některé soubory Dockerfile. Vygeneruje také soubor pom.xml se všemi potřebnými závislostmi (Hibernate, RESTEasy, Jackson, PostgreSQL a 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>
Poznámka
Všechny závislosti v souboru pom.xml jsou definovány v io.quarkus.platform:quarkus-bom
Quarkus BOM (kusovník) .
Kódování aplikace
Potom přejmenujte vygenerovanou třídu MyEntity.java na Todo.java (nachází se ve stejné složce jako soubor TodoResource.java). Nahraďte stávající kód následujícím kódem Java. K ukládání a načítání dat ze serveru PostgreSQL používá rozhraní Java Persistence API (balíčekjakarta.persistence.*
). Používá také Hibernate ORM s Panache (zděděné z io.quarkus.hibernate.orm.panache.PanacheEntity
) ke zjednodušení přetrvávací vrstvy.
Pomocí entity JPA (@Entity
) namapujete objekt java Todo
přímo na tabulku Todo
PostgreSQL. Koncový bod REST TodoResource
pak vytvoří novou třídu entity Todo
a zachová ji. Tato třída je doménový model mapovaný v tabulce Todo
. Tabulka je automaticky vytvořena JPA.
Rozšířením PanacheEntity
získáte řadu obecných metod vytvoření, čtení, aktualizace a odstranění (CRUD) pro váš typ. Můžete tak dělat věci, jako je ukládání a odstraňování objektů Todo
jenom na jednom řádku kódu Java.
Do entity Todo
přidejte následující kód:
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 +
'}';
}
}
Pokud chcete tuto třídu spravovat, aktualizujte TodoResource
, aby bylo možné publikovat rozhraní REST pro ukládání a načítání dat pomocí protokolu HTTP. Otevřete třídu TodoResource
a nahraďte kód následujícím kódem:
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();
}
}
Spuštění aplikace
Když aplikaci spustíte ve vývojovém režimu, musí být Docker spuštěný. Je to proto, že Quarkus zjistí, že potřebujete databázi PostgreSQL (kvůli závislosti PostgreSQL quarkus-jdbc-postgresql
deklarované v souboru pom.xml), stáhne image Dockeru PostgreSQL a spustí kontejner s databází. Potom automaticky vytvoří tabulku Todo
v databázi.
Pomocí tohoto příkazu se ujistěte, že na vašem počítači běží Docker, a spusťte aplikaci to-do:
cd todo
./mvnw quarkus:dev # On Mac or Linux
mvnw.cmd quarkus:dev # On Windows
Aplikace Quarkus by se měla spustit a připojit se k vaší databázi. Měl by se zobrazit následující výstup:
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>
K otestování aplikace můžete použít cURL.
V samostatném terminálu vytvořte novou položku to-do v databázi pomocí následujícího příkazu. V konzole Quarkus by se měl zobrazit protokol:
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
Tento příkaz by měl vrátit vytvořenou položku (s identifikátorem):
{"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"}
Pomocí následujícího příkazu cURL vytvořte druhý to-do:
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
Potom načtěte data pomocí nového požadavku cURL:
curl http://127.0.0.1:8080/api/todos
Tento příkaz vrátí seznam to-do položek, včetně položek, které jste vytvořili:
[
{"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}
]
Otestování aplikace
K otestování aplikace můžete použít existující třídu TodoResourceTest
. Musí otestovat koncový bod REST. K testování koncového bodu se používá RESTAssured. Nahraďte kód ve třídě TodoResourceTest
následujícím kódem:
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);
}
}
Při testování aplikace je potřeba spustit Docker Desktop, protože Quarkus zjistí, že k testování potřebuje databázi PostgreSQL. Otestujte aplikaci pomocí tohoto příkazu:
./mvnw clean test # On Mac or Linux
mvnw.cmd clean test # On Windows
Měl by se zobrazit výstup podobný tomuto:
[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] ------------------------------------------------------------------------