Overview
このガイドでは、ウェブフレームワークとして Quorum を使用し、 MongoDBにアクセスするために Eclipse JNoSQL を使用するJava REST APIを作成する方法を学習できます。が、クラウドネイティブ マイクロサービスとサーバーレス開発向けに設計されたオープンソースのJavaフレームワークです。 Eclipse JNOSQL は、 Javaアプリケーションと NoSQL データベースの統合を簡素化するために、 Jackarta NoSQL と Java Data 仕様を実装します。
このチュートリアルのアプリケーションは、次のレイヤーで構成されています。
データベースレイヤー: MongoDB は、データのストレージと検索を提供します。
アプリケーションレイヤー: Graphus は、 HTTPリクエスト、ルーティング、依存関係インジェクションを処理します。
データ アクセスレイヤー: JNoSQL はMongoDBドキュメントマッピングとリポジトリパターンを提供します。
Cluster でMongoDB を使用する理由
このチュートリアルでは、 Flexible JNoSQL 拡張機能 を使用してMongoDBにアクセスします。MongoDB は NoSQL データベース用の統合APIを提供し、既知のJavaパターンと注釈を使用してMongoDBを操作できます。その結果、 MongoDBと 引用符 を使用して、最小構成で軽量なアプリケーションを開発できます。
MongoDB をQueryus と統合することで、MongoDB の 柔軟なドキュメントモデルと並行して、Querys の高速スタートアップ時間とリソースの効率的な使用を活用できます。この組み合わせは、タイプの安全性、スケーラビリティ、迅速な開発サイクルを必要とするアプリケーションをサポートします。 MongoDBと Clusters を使用して、マイクロサービス、クラウドネイティブ API、高パフォーマンスと低リソース消費を必要とするシステムなどの本番環境のアプリケーションを作成できます。
クイック スタート チュートリアル
このチュートリアルでは、 MongoDBと 引用符 を使用するREST APIを構築する方法について説明します。アプリケーションはサンプルレストラン データにアクセスし、データをクエリし、 RESTflu エンドポイントから結果を返します。チュートリアルには、 MongoDB AtlasでホストされているMongoDBクラスターに接続するための手順も含まれています。
Tip
引用符を付けずにJavaドライバーを使用してMongoDBに接続する場合は、「 Javaドライバーを使い始める 」チュートリアルを参照してください。
プロジェクトを設定する
このセクションの手順に従って、プロジェクトの依存関係のインストール、Atlas クラスターの作成、およびアプリケーション構造の設定を行います。
前提条件を確認します。
クイック スタートアプリケーションを作成するには、開発環境に次のソフトウェアをインストールします。
前提条件 | ノート |
|---|---|
JDK バージョン 21 以降をインストールします。 | |
バージョン 3.8.1 以降を使用します。 | |
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. | |
コードエディター | お好みのコード エディターを使用してください。 |
ターミナルアプリとシェル | MacOS ユーザーの場合は、 ターミナル または 類似アプリを使用します。 Windowsユーザーの場合は、 PowerShell または コマンドプロンプトを使用します。 |
MongoDB Atlasクラスターを作成します。
MongoDB Atlas は、 MongoDB配置をホストするフルマネージドクラウドデータベースサービスです。 MongoDBデプロイがない場合は、 MongoDBを使い始める チュートリアルを完了することで、 MongoDBクラスターを無料で作成できます。 MongoDBを使い始めるsample_restaurants チュートリアルでは、このチュートリアルで使用される データベースなどのサンプルデータセットをクラスターにロードする方法も説明します。
MongoDBクラスターに接続するには、接続文字列を使用する必要があります。接続文字列を取得する方法については、 MongoDBを使い始めるチュートリアルの「 接続文字列列の追加 」セクションを参照してください。
重要
接続stringを安全な場所に保存します。
データベース接続を構成します。
src/main/resources/application.propertiesファイルに移動し、次の構成プロパティを追加します。
jnosql.document.database=sample_restaurants quarkus.mongodb.connection-string=<connection string>
このコードは、sample_restaurants MongoDBクラスター内の データベースへの接続を構成します。<connection string> プレースホルダーを、前の手順で保存した接続文字列に置き換えます。
テンプレート ファイルをクリーンアップします。
引用符プロジェクトテンプレートには、このチュートリアルで削除できるいくつかのサンプルファイルが含まれています。これらの不要なファイルを削除するには、オペレーティング システムに対応するタブを選択し、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
アプリケーションを作成する
プロジェクト構造と依存関係を設定したら、このセクションの手順に従って、データモデル、リポジトリクラス、 REST エンドポイントを作成します。
Restaurantモデルを作成します。
src/main/java/org/acmeディレクトリに Restaurant.java という名前のファイルを作成し、次のコードを貼り付けます。
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; } }
このファイルは、sample_restaurants.restaurantsコレクション内のドキュメントにマップする Restaurant エンティティクラスを定義します。 @Entity 注釈はこのクラスをJNoSQL エンティティとしてマークし、フィールド注釈はJavaプロパティをドキュメントフィールドにマッピングします。
リポジトリクラスを作成します。
src/main/java/org/acmeディレクトリに RestaurantRepository.java という名前のファイルを作成し、次のコードを貼り付けます。
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); }
このリポジトリクラスは、 MongoDB内のレストラン データにアクセスするためのメソッドを提供します。カスタム findByBorough() および findByCuisine() クエリ メソッドを定義します。また、RestaurantRepositoryインスタンスを使用して組み込みの作成、読み取り、アップデート、削除メソッドにアクセスすることもできます。
RESTリソースクラスを作成します。
src/main/java/org/acmeディレクトリに、RestaurantResource.java という名前のファイルを作成し、次のコードを貼り付けます。
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(); } } }
この RESTリソースクラスは、次のHTTPエンドポイントを定義します。
GET /restaurants/:restaurantsコレクションからすべてのドキュメントを取得しますGET /restaurants/browse: 名前に"Moon"を含むクイーンズのレストランを表すドキュメントを検索し、大文字と小文字を区別しないクエリを実行しますGET /restaurants/cuisine/{cuisine}: 指定されたcuisine値を提供するレストランを表すドキュメントを取得します
テストクラスを作成します。
src/test/java/org/acmeディレクトリに、RestaurantRepositoryTest.java という名前のファイルを作成し、次のコードを貼り付けます。
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(); } }
このファイルは、統合テストに Quorum のテストフレームワークを使用します。このコードでは、 MongoDB接続をテストするための次のメソッドを定義しています。
testRetrieveRestaurants():RestaurantRepositoryクラスがMongoDB にアクセスしていることを確認しますtestFindRestaurantsByBorough():findByBorough()メソッドがMongoDBデータを取得することを確認します
アプリケーションの実行
最後に、このセクションの手順に従ってREST API を実行し、curl コマンドを使用してエンドポイントをテストします。
テストを実行します。
まず、プロジェクトディレクトリから次のコマンドを実行してテスト スイートを実行します。
./mvnw test
このコマンドは RestaurantRepositoryTestクラスを実行し、アプリケーションがMongoDBデータにアクセスできることを確認します。成功した場合、コマンド出力には次の情報が含まれます。
[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] ------------------------------------------------------------------------
REST エンドポイントを手動でテストします。
REST エンドポイントをテストするには、別のターミナルウィンドウで次の curl コマンドを実行します。各エンドポイントは、 sample_restaurants.restaurantsコレクションからのレストラン情報を含むJSONデータを返します。成功した場合、コマンドはサンプル出力のようなデータを返します。
すべてのレストランを検索します。
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"}, ...] 名前に
"Moon"が含まれるクイーンズのレストランを検索します。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"}] 料理の種類でレストランを検索します。
次のコマンドは、
cuisine値が"Czech"であるレストランをクエリしますが、このパラメータは任意の料理に置き換えることができます。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"}]
Quorum クイック スタート チュートリアルが完了しました。これらの手順を完了すると、 MongoDBデプロイに接続し、サンプルレストラン データに対してクエリを実行し、curl コマンドを使用してテストできるHTTPエンドポイントを介して結果を公開するJavaが備えられます 。
追加リソース
引用符、JNoSQL、 MongoDBの詳細については、次のリソースを参照してください。