Упражнение. Создание приложения Quarkus
В этом уроке вы создадите базовое приложение Quarkus. Вы используете Maven для загрузки приложения и интегрированной среды разработки (IDE) для редактирования кода. Для выполнения кода можно использовать любой терминал. Вы используете Docker для запуска локальной базы данных PostgreSQL, чтобы запустить и протестировать приложение локально.
Создание приложения Quarkus с помощью Maven
Существует несколько способов создания структуры проекта Quarkus. Вы можете использовать веб-интерфейс Quarkus, подключаемый модуль интегрированной среды разработки или подключаемый модуль Quarkus Maven. Давайте используем подключаемый модуль Maven для создания структуры проекта.
Вы создаете приложение с несколькими зависимостями:
- Зависимость
resteasy
для предоставления конечной точки REST - Зависимость
jackson
для сериализации и десериализации JSON - Зависимость
hibernate
для взаимодействия с базой данных - Зависимость
postgresql
для подключения к базе данных PostgreSQL - Зависимость
docker
для создания образа Docker
Вам не нужно указывать зависимости Azure, так как сначала запускается приложение, а затем развертывает контейнерную версию в приложениях контейнеров Azure.
В командной строке создайте приложение для выполнения:
mvn -U io.quarkus:quarkus-maven-plugin:3.7.3:create \
-DplatformVersion=3.7.3 \
-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"
Эта команда создает проект Quarkus. Он создает структуру каталога Maven (src/main/java
для исходного кода и src/test/java
для тестов). Он создает некоторые классы Java, некоторые тесты и некоторые Файлы Dockerfile. Он также создает файл pom.xml со всеми необходимыми зависимостями (Hibernate, RESTEasy, Джексон, PostgreSQL и 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>
Примечание.
Все зависимости в файле pom.xml определяются в BOM Quarkus (счет за материалы). io.quarkus.platform:quarkus-bom
Добавление кода приложения
Затем переименуйте созданный класс MyEntity.java на Todo.java (расположен в той же папке, что и файл TodoResource.java ). Замените существующий код следующим кодом Java. Он использует API сохраняемости Java (jakarta.persistence.*
пакет) для хранения и извлечения данных с сервера PostgreSQL. Он также использует Hibernate ORM с Panache (наследование от io.quarkus.hibernate.orm.panache.PanacheEntity
) для упрощения уровня сохраняемости.
Сущность JPA (@Entity
) используется для сопоставления объекта Java Todo
непосредственно с таблицей PostgreSQL Todo
. Затем конечная TodoResource
точка REST создает новый Todo
класс сущности и сохраняет его. Этот класс представляет собой модель предметной области, сопоставленную с таблицей Todo
. Таблица автоматически создается JPA.
PanacheEntity
Расширение позволяет получить ряд универсальных методов создания, чтения, обновления и удаления (CRUD) для вашего типа. Таким образом, вы можете выполнять такие действия, как сохранение и удаление Todo
объектов в одной строке кода Java.
Добавьте следующий код в Todo
сущность:
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 +
'}';
}
}
Чтобы управлять этим классом, обновите TodoResource
его, чтобы опубликовать интерфейсы REST для хранения и извлечения данных с помощью ПРОТОКОЛА HTTP. TodoResource
Откройте класс и замените код следующим кодом:
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();
}
}
Выполнение приложения
При запуске приложения в режиме разработки Docker необходимо запустить. Это связано с тем, что Quarkus обнаруживает, что требуется база данных PostgreSQL (из-за зависимости quarkus-jdbc-postgresql
PostgreSQL, объявленной в файле pom.xml ), скачивает образ Docker PostgreSQL и запускает контейнер с базой данных. Затем она автоматически создает таблицу Todo
в базе данных.
Убедитесь, что Docker работает локально на компьютере и запустите приложение для выполнения этой команды:
cd todo
./mvnw quarkus:dev # On Mac or Linux
mvnw.cmd quarkus:dev # On Windows
Приложение Quarkus должно запускаться и подключаться к базе данных. Должен появиться следующий результат:
[io.qua.dat.dep.dev.DevServicesDatasourceProcessor] Dev Services for the default datasource (postgresql) started.
[io.qua.hib.orm.dep.HibernateOrmProcessor] Setting quarkus.hibernate-orm.database.generation=drop-and-create to initialize Dev Services managed database
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
[org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) SQL Warning Code: 0, SQLState: 00000
[org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) table "todo" does not exist, skipping
[org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) SQL Warning Code: 0, SQLState: 00000
[org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) sequence "hibernate_sequence" does not exist, skipping
[io.quarkus] (Quarkus Main Thread) todo 1.0.0-SNAPSHOT on JVM (powered by Quarkus) started in 4.381s. Listening on: http://localhost:8080
[io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
[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 [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
Чтобы протестировать приложение, можно использовать cURL.
В отдельном терминале создайте новый элемент для выполнения в базе данных с помощью следующей команды. Вы увидите журнал в консоли Quarkus:
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
Эта команда должна возвращать созданный элемент (с идентификатором):
{"id":1,"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done":true,"createdAt":"2022-12-30T15:17:20.280203Z"}
Создайте секунду для выполнения с помощью следующей команды cURL:
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
Затем извлеките данные, используя новый запрос cURL:
curl http://127.0.0.1:8080/api/todos
Эта команда возвращает список дел, включая созданные элементы:
[
{"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}
]
Тестирование приложения
Для тестирования приложения можно использовать существующий TodoResourceTest
класс. Он должен протестировать конечную точку REST. Для тестирования конечной точки используется RESTAssured. Замените TodoResourceTest
код в классе следующим кодом:
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);
}
}
При тестировании приложения Docker Desktop необходимо запустить, так как Quarkus обнаруживает, что для тестирования требуется база данных PostgreSQL. Протестируйте приложение с помощью этой команды:
./mvnw clean test # On Mac or Linux
mvnw.cmd clean test # On Windows
Результат должен выглядеть примерно так:
[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] ------------------------------------------------------------------------