Gyakorlat – Quarkus-alkalmazás létrehozása

Befejeződött

Ebben az egységben egy alapszintű Quarkus-alkalmazást hoz létre. A Maven használatával elindíthatja az alkalmazást és egy tetszőleges integrált fejlesztési környezetet (IDE) a kód szerkesztéséhez. A kód futtatásához használjon egy tetszőleges terminált. A Dockerrel elindíthat egy helyi PostgreSQL-adatbázist, hogy helyileg futtathassa és tesztelhesse az alkalmazást.

A Quarkus-alkalmazás létrehozása a Maven használatával

A Quarkus-projektstruktúra többféleképpen is létrehozható. Használhatja a Quarkus webes felületet, az IDE bővítményt vagy a Quarkus Maven bővítményt. Használjuk a Maven beépülő modult a projektstruktúra létrehozásához.

Az alkalmazást több függőséggel hozza létre:

  • A REST-végpont exponálásához szükséges resteasy függőség
  • A JSON szerializálásához és deszerializálásához használt jackson függőség
  • Az adatbázissal való interakcióhoz használt hibernate függőség
  • A PostgreSQL-adatbázishoz való csatlakozás postgresql függősége
  • Docker-rendszerkép létrehozásához használt docker függőség

Nem kell Azure-függőségeket megadnia, mert először helyileg futtatja az alkalmazást, majd üzembe helyezi annak egy tárolóalapú verzióját az Azure Container Appsben.

Parancssorban hozza létre a to-do alkalmazást:

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"

Ez a parancs létrehoz egy új Quarkus-projektet. Létrehoz egy Maven-címtárstruktúrát (src/main/java a forráskódhoz és a tesztekhez src/test/java). Létrehoz néhány Java-osztályt, néhány tesztet és néhány Docker-fájlt. Emellett létrehoz egy pom.xml fájlt az összes szükséges függőséggel (Hibernate, RESTEasy, Jackson, PostgreSQL és 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>

Jegyzet

A pom.xml fájlban lévő összes függőség a Quarkus BOM -ban (anyagjegyzék) io.quarkus.platform:quarkus-bomvan definiálva.

Az alkalmazás kódolása

Ezután nevezze át a létrehozott MyEntity.java osztályt Todo.java (ugyanabban a mappában található, mint a TodoResource.java fájl). Cserélje le a meglévő kódot a következő Java-kódra. Java Persistence API-t (jakarta.persistence.* csomagot) használ a PostgreSQL-kiszolgáló adatainak tárolására és lekérésére. A Hibernate ORM és a Panache (a io.quarkus.hibernate.orm.panache.PanacheEntityöröklése) használatával leegyszerűsíti a perzisztenciaréteget.

A Java @Entity objektum közvetlenül a PostgreSQL Todo táblához való leképezéséhez JPA-entitást (Todo) használ. A TodoResource REST-végpont ezután létrehoz egy új Todo entitásosztályt, és megőrzi azt. Ez az osztály egy tartománymodell, amely a Todo táblára van leképezve. A táblázatot a JPA automatikusan létrehozza.

A PanacheEntity kibővítése számos általános létrehozási, olvasási, frissítési és törlési (CRUD) metódust biztosít a típushoz. Így például a Java-kód egyetlen sorában mentheti és törölheti Todo objektumokat.

Adja hozzá a következő kódot a Todo entitáshoz:

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 +
                '}';
    }
}

Az osztály kezeléséhez frissítse a TodoResource, hogy REST-felületeket tegyen közzé az adatok HTTP használatával történő tárolásához és lekéréséhez. Nyissa meg a TodoResource osztályt, és cserélje le a kódot a következőre:

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();
    }
}

Az alkalmazás futtatása

Ha fejlesztési módban futtatja az alkalmazást, a Dockernek futnia kell. Ennek az az oka, hogy a Quarkus észleli, hogy szüksége van egy PostgreSQL-adatbázisra (a quarkus-jdbc-postgresql fájlban deklarált PostgreSQL-függőség miatt), letölti a PostgreSQL Docker-lemezképet, és elindít egy tárolót az adatbázissal. Ezután automatikusan létrehozza a Todo táblát az adatbázisban.

Győződjön meg arról, hogy a Docker helyileg fut a számítógépen, és futtassa a to-do alkalmazást a következő paranccsal:

cd todo
./mvnw quarkus:dev    # On Mac or Linux
mvnw.cmd quarkus:dev  # On Windows

A Quarkus-alkalmazásnak el kell indulnia, és csatlakoznia kell az adatbázishoz. A következő kimenetnek kell megjelennie:

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>

Az alkalmazás teszteléséhez használhatja a cURL-t.

Egy külön terminálban hozzon létre egy új to-do elemet az adatbázisban az alábbi paranccsal. A naplónak a Quarkus konzolon kell megjelennie:

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

Ennek a parancsnak a létrehozott elemet kell visszaadnia (azonosítóval):

{"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"}

Hozzon létre egy második to-do a következő cURL paranccsal:

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

Ezután kérje le az adatokat egy új cURL-kéréssel:

curl http://127.0.0.1:8080/api/todos

Ez a parancs a to-do elemek listáját adja vissza, beleértve a létrehozott elemeket is:

[ 
  {"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}
]

Az alkalmazás tesztelése

Az alkalmazás teszteléséhez használhatja a meglévő TodoResourceTest osztályt. Tesztelnie kell a REST-végpontot. A végpont teszteléséhez RESTAssuredhasznál. Cserélje le a TodoResourceTest osztály kódját a következő kódra:

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);
    }
}

Az alkalmazás tesztelésekor a Docker Desktopnak futnia kell, mert a Quarkus észleli, hogy a teszteléshez szüksége van a PostgreSQL-adatbázisra. Tesztelje az alkalmazást a következő paranccsal:

./mvnw clean test    # On Mac or Linux
mvnw.cmd clean test  # On Windows

A következőhöz hasonló kimenetnek kell megjelennie:

[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] ------------------------------------------------------------------------