Alıştırma - Quarkus uygulaması oluşturma
Bu ünitede temel bir Quarkus uygulaması oluşturacaksınız. Maven kullanarak uygulamayı ve kodu düzenlemek için tercih ettiğiniz tümleşik geliştirme ortamını (IDE) önyüklersiniz. Kodu çalıştırmak için tercihinize göre bir terminal kullanın. Docker'ı kullanarak yerel bir PostgreSQL veritabanı başlatırsınız, böylece uygulamayı yerel olarak çalıştırabilir ve test edebilirsiniz.
Maven kullanarak Quarkus uygulamasını oluşturma
Quarkus proje yapısı oluşturmanın birkaç yolu vardır. Quarkus web arabirimini, IDE eklentisini veya Quarkus Maven eklentisini kullanabilirsiniz. Proje yapısını oluşturmak için Maven eklentisini kullanalım.
Uygulamanızı çeşitli bağımlılıklarla oluşturursunuz:
-
resteasybağımlılığı ile bir REST uç noktasını kullanıma sunma - JSON'u serileştirmek ve seri durumdan çıkarmak için
jacksonbağımlılığı - Veritabanıyla etkileşime geçmek için
hibernatebağımlılığı - PostgreSQL veritabanına bağlanmak için
postgresqlbağımlılığı - Docker görüntüsü oluşturmak için
dockerbağımlılığı
Önce uygulamanızı yerel olarak çalıştırıp ardından azure containerized sürümünü Azure Container Apps'e dağıttığınızdan Azure bağımlılıkları belirtmeniz gerekmez.
Komut isteminde to-do uygulamasını oluşturun:
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"
Bu komut yeni bir Quarkus projesi oluşturur. Bir Maven dizin yapısı oluşturur (kaynak kodu içinsrc/main/java ve testler için src/test/java). Bazı Java sınıfları, bazı testler ve bazı Dockerfile'lar oluşturur. Ayrıca tüm gerekli bağımlılıkları (Hazırda Beklet, RESTEasy, Jackson, PostgreSQL ve Docker) içeren bir pom.xml dosyası oluşturur:
<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>
Not
pom.xml dosyasındaki tüm bağımlılıklar Quarkus BOM(ürün reçetesi) io.quarkus.platform:quarkus-bomiçinde tanımlanır.
Uygulamayı kodlayın
Ardından, oluşturulan MyEntity.java sınıfını Todo.java olarak yeniden adlandırın ( TodoResource.java dosyasıyla aynı klasörde bulunur). Mevcut kodu aşağıdaki Java koduyla değiştirin. PostgreSQL sunucunuzdan veri depolamak ve almak için Java Kalıcılık API'sini (jakarta.persistence.* paketi) kullanır. Ayrıca kalıcılık katmanını basitleştirmek için, 'den devralarak Panache io.quarkus.hibernate.orm.panache.PanacheEntity Hibernate ORM'yi kullanır.
Java @Entity nesnesini doğrudan PostgreSQL Todo tablosuna eşlemek için jpa varlığı (Todo) kullanırsınız.
TodoResource REST uç noktası daha sonra yeni bir Todo varlık sınıfı oluşturur ve bunu kalıcı hale alır. Bu sınıf, Todo tablosuna eşlenen bir etki alanı modelidir. Tablo JPA tarafından otomatik olarak oluşturulur.
PanacheEntity genişletmek, türünüz için bir dizi genel oluşturma, okuma, güncelleştirme ve silme (CRUD) yöntemi sağlar. Böylece, Todo nesneleri tek bir Java kodu satırında kaydetme ve silme gibi işlemler yapabilirsiniz.
Todo varlığına aşağıdaki kodu ekleyin:
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 +
'}';
}
}
Bu sınıfı yönetmek için TodoResource güncelleştirerek HTTP kullanarak verileri depolamak ve almak için REST arabirimleri yayımlayabilmesini sağlayın.
TodoResource sınıfını açın ve kodu aşağıdakilerle değiştirin:
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();
}
}
Uygulamayı çalıştırma
Uygulamayı geliştirme modunda çalıştırdığınızda Docker'ın çalışıyor olması gerekir. Bunun nedeni Quarkus'un postgreSQL veritabanına ihtiyacınız olduğunu algılaması (quarkus-jdbc-postgresql dosyasında bildirilen PostgreSQL bağımlılığı nedeniyle), PostgreSQL Docker görüntüsünü indirmesi ve veritabanıyla bir kapsayıcı başlatmasıdır. Ardından veritabanında Todo tablosunu otomatik olarak oluşturur.
Docker'ın makinenizde yerel olarak çalıştığından emin olun ve şu komutu kullanarak to-do uygulamasını çalıştırın:
cd todo
./mvnw quarkus:dev # On Mac or Linux
mvnw.cmd quarkus:dev # On Windows
Quarkus uygulamasının başlatılması ve veritabanınıza bağlanması gerekir. Aşağıdaki çıkışı görmeniz gerekir:
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>
Uygulamayı test etmek için cURL kullanabilirsiniz.
Ayrı bir terminalde aşağıdaki komutu kullanarak veritabanında yeni bir to-do öğesi oluşturun. Günlüğü Quarkus konsolunda görmeniz gerekir:
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
Bu komut, oluşturulan öğeyi döndürmelidir (tanımlayıcı ile):
{"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"}
Aşağıdaki cURL komutunu kullanarak ikinci bir to-do oluşturun:
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
Ardından, yeni bir cURL isteği kullanarak verileri alın:
curl http://127.0.0.1:8080/api/todos
Bu komut, oluşturduğunuz öğeler de dahil olmak üzere to-do öğelerinin listesini döndürür:
[
{"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}
]
Uygulamayı test edin
Uygulamayı test etmek için mevcut TodoResourceTest sınıfını kullanabilirsiniz. REST uç noktasını test etmesi gerekir. Uç noktayı test etmek için RESTAssured kullanır.
TodoResourceTest sınıfındaki kodu aşağıdaki kodla değiştirin:
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);
}
}
Uygulamayı test ettiğinizde, Quarkus test için PostgreSQL veritabanına ihtiyacı olduğunu algıladığından Docker Desktop'ın çalışıyor olması gerekir. Şu komutu kullanarak uygulamayı test edin:
./mvnw clean test # On Mac or Linux
mvnw.cmd clean test # On Windows
Şuna benzer bir çıktı görmelisiniz:
[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] ------------------------------------------------------------------------