Visão geral
Neste guia, você pode aprender a criar uma API Java REST que usa Quakus como a estrutura da Web e Eclipse JNoSQL para acessar MongoDB. O 4kus é um framework Java de código aberto projetado para microsserviços nativos da nuvem e desenvolvimento sem servidor. O Eclipse JNOSQL implementa as especificações Jakarta NoSQL e Jakarta Data para simplificar a integração de aplicativos Java com bancos de dados NoSQL.
O aplicativo neste tutorial consiste nas seguintes camadas:
Camada de banco de dados: o MongoDB fornece armazenamento e recuperação de dados.
Camada de aplicação: o Quartokus lida com requisições HTTP, roteamento e injeção de dependência.
Camada de acesso a dados: JNoSQL fornece mapeamento de documento e padrões de repositório do MongoDB .
Por que usar o MongoDB com o Quarkus?
Este tutorial usa a extensão Quandokus JNoSQL para acessar o MongoDB, que fornece uma API unificada para bancos de dados NoSQL e permite que você trabalhe com o MongoDB usando padrões e anotações Java conhecidos. Como resultado, você pode usar MongoDB e Quartokus para desenvolver aplicativos leves com configuração mínima.
Ao integrar o MongoDB com o Quarkus, você pode aproveitar os rápidos tempos de inicialização e o uso eficiente de recursos do QuartoDB junto com o modelo de documento flexível do MongoDB. Essa combinação oferece suporte a aplicativos que exigem segurança de tipo, escalabilidade e ciclos de desenvolvimento rápidos. Você pode usar MongoDB e Quarkus para criar aplicativos do mundo real, como microsserviços, APIs nativas da nuvem ou sistemas que exigem alto desempenho e baixo consumo de recursos.
Tutorial de início rápido
Este tutorial mostra como construir uma API REST que usa MongoDB e Quartokus. O aplicação acessa dados de restaurantes de amostra, consulta os dados e retorna os resultados por meio de endpoints RESTful. O tutorial também inclui instruções para conectar-se a um cluster MongoDB hospedado no MongoDB Atlas.
Dica
Se você preferir se conectar ao MongoDB usando o driver Java sem o Quarkus, consulte o tutorial Introdução ao driver Java .
Configurar seu projeto
Siga as etapas nesta seção para instalar as dependências do projeto, criar um cluster do Atlas e configurar a estrutura do aplicativo.
Verifique os pré-requisitos.
Para criar o aplicativo Quick Start, instale o seguinte software em seu ambiente de desenvolvimento:
Pré-requisitos | Notas |
|---|---|
Instale o JDK versão 21 ou posterior. | |
Use a versão 3.8.1 ou posterior. | |
This command-line interface allows you to create and manage Quarkus
projects from your terminal. Important: This tutorial uses version 3.30.6, and later versions
might cause errors. Follow the installation instructions
corresponding to your operating system to install the specific version. | |
Editor de código | Use o editor de código de sua escolha. |
Aplicativo de terminal e shell | Para usuários do MacOS, use o Terminal ou um aplicativo semelhante. Para usuários do Windows, use o PowerShell ou Prompt de Comando. |
Criar um cluster MongoDB Atlas .
O MongoDB Atlas é um serviço de banco de dados de nuvem totalmente gerenciado que hospeda suas implementações do MongoDB . Se você não tiver uma implementação do MongoDB , poderá criar um cluster do MongoDB gratuitamente concluindo o tutorial de Introdução ao MongoDB . O tutorial de Introdução ao MongoDB também demonstra como carregar conjuntos de dados de exemplo em seu cluster, incluindo o sample_restaurants banco de dados usado neste tutorial.
Para se conectar ao cluster MongoDB , você deve usar uma string de conexão. Para saber como recuperar sua string de conexão, consulte a seção Adicionar sua string de conexão do tutorial de Introdução ao MongoDB .
Importante
Salve sua string de conexão em um local seguro.
Crie seu projeto no Quartokus .
A partir do seu terminal, execute o seguinte comando para criar um novo projeto Quartokus denominado quarkus-quickstart que configura a Extensão JNoSQL do Horakus para MongoDB e serialização JSON para endpoints REST:
quarkus create app quarkus-quickstart --extensions=jnosql-mongodb,resteasy-jackson
Em seguida, navegue até o diretório do projeto executando o seguinte comando:
cd quarkus-quickstart
Configure sua conexão do banco de dados .
Navegue até o arquivo src/main/resources/application.properties e adicione as seguintes propriedades de configuração:
jnosql.document.database=sample_restaurants quarkus.mongodb.connection-string=<connection string>
Este código configura sua conexão com o sample_restaurants banco de dados do em seu agrupamento MongoDB . Substitua <connection string> o espaço reservado pela string de conexão que você salvou em uma etapa anterior.
Limpe os arquivos de modelo.
O modelo de projeto Quarkus inclui alguns arquivos de exemplo que você pode remover para este tutorial. Para excluir estes arquivos desnecessários, selecione a guia correspondente ao seu sistema operacional e execute os seguintes comandos do diretório quarkus-quickstart:
rm src/main/java/org/acme/Car.java rm src/main/java/org/acme/Garage.java rm src/test/java/org/acme/GarageTest.java rm src/main/java/org/acme/GreetingResource.java rm src/test/java/org/acme/GreetingResourceIT.java rm src/test/java/org/acme/GreetingResourceTest.java
del src/main/java/org/acme/Car.java del src/main/java/org/acme/Garage.java del src/test/java/org/acme/GarageTest.java del src/main/java/org/acme/GreetingResource.java del src/test/java/org/acme/GreetingResourceIT.java del src/test/java/org/acme/GreetingResourceTest.java
Crie seu aplicativo
Após configurar a estrutura e as dependências do projeto , siga as etapas desta seção para criar seu modelo de dados, a classe de repositório e os endpoints REST.
Criar o Restaurant modelo.
Crie um arquivo denominado Restaurant.java no diretório src/main/java/org/acme e cole o seguinte código:
package org.acme; import jakarta.nosql.Column; import jakarta.nosql.Entity; import jakarta.nosql.Id; /** * Represents a restaurant entity from the sample_restaurants database . * This class is used as an entity in the MongoDB database. */ public class Restaurant { private String id; private String name; private String borough; private String cuisine; // Default constructor required by JNoSQL public Restaurant() {} // Constructor public Restaurant(String id, String name, String borough,String cuisine) { this.id = id; this.name = name; this.borough = borough; this.cuisine = cuisine; } // Getters and setters public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getBorough() { return borough; } public void setBorough(String borough) { this.borough = borough; } public String getCuisine() { return cuisine; } public void setCuisine(String cuisine) { this.cuisine = cuisine; } }
Este arquivo define a classe de entidade Restaurant , que mapeia para documentos na coleção sample_restaurants.restaurants. A anotação @Entity marca esta classe como uma entidade JNoSQL e as anotações de campo mapeiam propriedades Java para campos de documento .
Crie a classe de repositório .
Crie um arquivo denominado RestaurantRepository.java no diretório src/main/java/org/acme e cole o seguinte código:
package org.acme; import jakarta.data.repository.Repository; import org.eclipse.jnosql.mapping.NoSQLRepository; import java.util.List; /** * Interface for managing restaurant data. * * It uses the Jakarta Data Specification capabilities. * */ public interface RestaurantRepository extends NoSQLRepository<Restaurant, String> { List<Restaurant> findByBorough(String borough); List<Restaurant> findByCuisine(String cuisine); }
Esta classe de repositório fornece métodos para acessar dados de restaurantes no MongoDB. Ela define métodos de query personalizados do findByBorough() e findByCuisine(), e você também pode utilizar uma instância do RestaurantRepository para acessar os métodos integrados de criação, leitura, atualização e exclusão.
Crie a classe de recurso REST.
No diretório src/main/java/org/acme, crie um arquivo denominado RestaurantResource.java e cole o seguinte código:
package org.acme; import jakarta.inject.Inject; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import java.util.List; /** * REST API controller for restaurant operations. * Provides endpoints for retrieving restaurant data from MongoDB. */ public class RestaurantResource { RestaurantRepository restaurantRepository; /** * Retrieves all restaurants from the database. * * @return List of all restaurants */ public Response getAllRestaurants() { try { List<Restaurant> restaurants = restaurantRepository.findAll().toList(); System.out.println("Found " + restaurants.size() + " restaurants"); return Response.ok(restaurants).build(); } catch (Exception e) { e.printStackTrace(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Error retrieving restaurants: " + e.getMessage()) .build(); } } /** * Retrieves filtered restaurants in Queens that contain "Moon" in the name. * * @return List of filtered restaurants */ public Response getFilteredRestaurants() { try { // Temporarily use findAll() to test basic connectivity List<Restaurant> allRestaurants = restaurantRepository.findAll().toList(); System.out.println("Total restaurants found: " + allRestaurants.size()); // Filter for Queens restaurants that also have "Moon" in the name List<Restaurant> queensRestaurants = allRestaurants.stream() .filter(restaurant -> "Queens".equals(restaurant.getBorough()) && restaurant.getName() != null && restaurant.getName().toLowerCase().contains("moon")) .toList(); System.out.println("Queens restaurants found: " + queensRestaurants.size()); return Response.ok(queensRestaurants).build(); } catch (Exception e) { e.printStackTrace(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Error retrieving filtered restaurants: " + e.getMessage()) .build(); } } /** * Retrieves restaurants by cuisine type. * * @param cuisine The cuisine type to filter for * @return List of restaurants that have the specified cuisine */ public Response getRestaurantsByCuisine( String cuisine) { try { List<Restaurant> restaurants = restaurantRepository.findByCuisine(cuisine); return Response.ok(restaurants).build(); } catch (Exception e) { return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("Error retrieving restaurants by cuisine: " + e.getMessage()) .build(); } } }
Esta classe de recurso REST define os seguintes endpoints HTTP:
GET /restaurants/: Recupera todos os documentos da coleçãorestaurantsGET /restaurants/browse: Recupera documentos que representam restaurantes no Queins contendo"Moon"em seu nome, realizando uma query sem distinção entre maiúsculas e minúsculasGET /restaurants/cuisine/{cuisine}: recupera documentos que representam restaurantes que oferecem o valor decuisineespecificado
Crie uma classe de teste .
No diretório src/test/java/org/acme, crie um arquivo denominado RestaurantRepositoryTest.java e cole o seguinte código:
package org.acme; import io.quarkus.test.junit.QuarkusTest; import jakarta.inject.Inject; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; /** * RestaurantRepositoryTest is a test class for testing the RestaurantRepository operations. * * It uses the Quarkus Test framework to test the restaurant data access. */ public class RestaurantRepositoryTest { RestaurantRepository restaurantRepository; public void testRetrieveRestaurants() { // Test repository injection and MongoDB connection assertThat(restaurantRepository).isNotNull(); } public void testFindRestaurantsByBorough() { // Test that the method exists and returns data List<Restaurant> restaurants = restaurantRepository.findByBorough("Queens"); assertThat(restaurants).isNotNull(); } }
Este arquivo usa a estrutura de testes do Quartokus para testes de integração. O código define os seguintes métodos para testar sua conexão MongoDB :
testRetrieveRestaurants(): verifica se sua classeRestaurantRepositoryacessa o MongoDBtestFindRestaurantsByBorough(): verifica se o métodofindByBorough()recupera dados do MongoDB
Execute seu aplicativo
Por fim, siga as etapas desta seção para executar sua API REST e testar os endpoints usando comandos curl.
Execute os testes.
Primeiro, execute o seguinte comando no diretório do projeto para executar a suíte de testes:
./mvnw test
Este comando executa a classe RestaurantRepositoryTest e verifica se seu aplicação pode acessar dados MongoDB . Se for bem-sucedida, a saída do comando conterá as seguintes informações:
[INFO] Results: [INFO] [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: ... s [INFO] Finished at: ... [INFO] ------------------------------------------------------------------------
Teste manualmente os endpoints REST.
Em uma janela de terminal separada, execute os seguintes comandos curl para testar os endpoints REST. Cada endpoint retorna dados JSON contendo informações de restaurante da coleção sample_restaurants.restaurants. Se bem-sucedidos, seus comandos retornarão dados semelhantes aos resultados da amostra.
Recupere todos os restaurantes.
curl http://localhost:8080/restaurants/ [{"id":"...","name":"Morris Park Bake Shop","borough":"Bronx","cuisine":"Bakery"}, {"id":"...","name":"Wilken'S Fine Food","borough":"Brooklyn","cuisine":"Delicatessen"}, {"id":"...","name":"Taste The Tropics Ice Cream","borough":"Brooklyn","cuisine":"Ice Cream, Gelato, Yogurt, Ices"}, {"id":"...","name":"Carvel Ice Cream","borough":"Queens","cuisine":"Ice Cream, Gelato, Yogurt, Ices"}, ...] Recupere restaurantes no Queins que tenham
"Moon"no nome.curl http://localhost:8080/restaurants/browse [{"id":"...","name":"Somoon","borough":"Queens","cuisine":"Asian"}, {"id":"...","name":"New Moon Star Restaurant","borough":"Queens","cuisine":"Chinese"}, {"id":"...","name":"Moon Tikka Grill","borough":"Queens","cuisine":"Indian"}, {"id":"...","name":"Silver Moon Diner","borough":"Queens","cuisine":"American"}, {"id":"...","name":"Mooney'S Public House","borough":"Queens","cuisine":"Irish"}, {"id":"...","name":"Moon Light Crill Rest.","borough":"Queens","cuisine":"Indian"}, {"id":"...","name":"Full Moon Cafe","borough":"Queens","cuisine":"Café/Coffee/Tea"}, {"id":"...","name":"Pacific Moon","borough":"Queens","cuisine":"Chinese"}, {"id":"...","name":"Moon Palace Kitchen","borough":"Queens","cuisine":"Chinese"}, {"id":"...","name":"Honey Moon Coffee Shop 1766096115682","borough":"Queens","cuisine":"Café/Coffee/Tea"}, {"id":"...","name":"Honey Moon Coffee Shop","borough":"Queens","cuisine":"Café/Coffee/Tea"}] Recupere restaurantes por tipo de cozinha.
As seguintes queries de comando para restaurantes que têm um
cuisinevalor de"Czech", mas você pode substituir este parâmetro por qualquer cozinha:curl http://localhost:8080/restaurants/cuisine/Czech [{"id":"...","name":"Koliba Restaurant","borough":"Queens","cuisine":"Czech"}, {"id":"...","name":"Milan'S Restaurant","borough":"Brooklyn","cuisine":"Czech"}, {"id":"...","name":"Bohemian Beer Garden","borough":"Queens","cuisine":"Czech"}, {"id":"...","name":"Hospoda","borough":"Manhattan","cuisine":"Czech"}, {"id":"...","name":"Olde Prague Tavern","borough":"Queens","cuisine":"Czech"}, {"id":"...","name":"Brooklyn Beet Company","borough":"Brooklyn","cuisine":"Czech"}]
Parabéns por concluir o tutorial Início Rápido do Quandokus! Depois de concluir essas etapas, você tem uma API REST Java Quekus que se conecta à sua implantação do MongoDB , executa queries em dados de restaurantes de exemplo e expõe os resultados por meio de endpoints HTTP que você pode testar usando comandos curl.
Recursos adicionais
Para saber mais sobre Quartokus, JNoSQL e MongoDB, consulte os seguintes recursos:
Documentação doQuarkus
Documentaçãodo Eclipse JNoSQL
Documentação dodriver Java do MongoDB