Skip to content

couchbase-examples/java-springdata-quickstart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Quickstart in Couchbase with Spring Data and Java

REST API using Couchbase Capella in Java using Spring Data

Often, the first step developers take after creating their database is to create a REST API that can perform Create, Read, Update, and Delete (CRUD) operations for that database. This repo is designed to teach you and give you a starter project (in Java using Spring Data) to generate such a REST API. After you have installed the travel-sample bucket in your database, you can run this application which is a REST API with Swagger documentation so that you can learn:

  1. How to create, read, update, and delete documents using Key-Value operations (KV operations). KV operations are unique to Couchbase and provide super fast (think microseconds) queries.
  2. How to write simple parameterized SQL++ Queries using the built-in travel-sample bucket.

Full documentation for the tutorial can be found on the Couchbase Developer Portal.

This example uses spring data, however, if you are looking for springboot sample app please go to this repository.

Prerequisites

To run this prebuilt project, you will need:

App Setup

We will walk through the different steps required to get the application running.

Cloning Repo

git clone https://github.com/couchbase-examples/java-springdata-quickstart.git

Install Dependencies

The dependencies for the application are specified in the build.gradle file in the source folder. Dependencies can be installed through gradle the default package manager for Java.

gradle build -x test

Note: The -x test option is used to skip the tests. The tests require the application to be running.

Note: The application is tested with Java 17. If you are using a different version of Java, please update the build.gradle file accordingly.

Setup Database Configuration

To learn more about connecting to your Capella cluster, please follow the instructions.

Specifically, you need to do the following:

  • Create the database credentials to access the travel-sample bucket (Read and Write) used in the application.
  • Allow access to the Cluster from the IP on which the application is running.

All configuration for communication with the database is read from the environment variables. We have provided a convenience feature in this quickstart to read the environment variables from a local file, application.properties in the src/main/resources folder.

You can also set the environment variables directly in your environment such as:

export DB_CONN_STR=couchbases://<cluster-url>
export DB_USERNAME=Administrator
export DB_PASSWORD=password

The application.properties file should look like this:

server.forward-headers-strategy=framework
spring.couchbase.bootstrap-hosts=DB_CONN_STR
spring.couchbase.bucket.name=travel-sample
spring.couchbase.bucket.user=DB_USERNAME
spring.couchbase.bucket.password=DB_PASSWORD
spring.couchbase.scope.name=inventory

You can specify the connection string, username, and password using environment variables. The application will read these environment variables and use them to connect to the database.

Additionally, you can specify the connection string, username, and password directly in the application.properties file.

Note: The connection string expects the couchbases:// or couchbase:// part.

Cluster Connection Configuration

You do not need to make any changes to your configuration for this quickstart. However, read this section if you want to learn more about how Spring Data Couchbase connector can be configured by providing a @Configuration bean that extends AbstractCouchbaseConfiguration.

@Slf4j
@Configuration
@EnableCouchbaseRepositories
public class CouchbaseConfiguration extends AbstractCouchbaseConfiguration {

  @Value("#{systemEnvironment['DB_CONN_STR'] ?: '${spring.couchbase.bootstrap-hosts:localhost}'}")
  private String host;

  @Value("#{systemEnvironment['DB_USERNAME'] ?: '${spring.couchbase.bucket.user:Administrator}'}")
  private String username;

  @Value("#{systemEnvironment['DB_PASSWORD'] ?: '${spring.couchbase.bucket.password:password}'}")
  private String password;

  @Value("${spring.couchbase.bucket.name:travel-sample}")
  private String bucketName;

  @Override
  public String getConnectionString() {
    return host;
  }

  @Override
  public String getUserName() {
    return username;
  }

  @Override
  public String getPassword() {
    return password;
  }

  @Override
  public String getBucketName() {
    return bucketName;
  }

  @Override
  public String typeKey() {
    return "type";
  }

  @Override
  @Bean(destroyMethod = "disconnect")
  public Cluster couchbaseCluster(ClusterEnvironment couchbaseClusterEnvironment) {
    try {
      log.debug("Connecting to Couchbase cluster at " + host);
      return Cluster.connect(getConnectionString(), getUserName(), getPassword());
    } catch (Exception e) {
      log.error("Error connecting to Couchbase cluster", e);
      throw e;
    }
  }

  @Bean
  public Bucket getCouchbaseBucket(Cluster cluster) {
    try {
      if (!cluster.buckets().getAllBuckets().containsKey(getBucketName())) {
        log.error("Bucket with name {} does not exist. Creating it now", getBucketName());
        throw new BucketNotFoundException(bucketName);
      }
      return cluster.bucket(getBucketName());
    } catch (Exception e) {
      log.error("Error getting bucket", e);
      throw e;
    }
  }

}

from config/CouchbaseConfiguration.java

This default configuration assumes that you have a locally running Couchbae server and use a standard administrative login and password for demonstration purposes. Applications deployed to production or staging environments should use less privileged credentials created using Role-Based Access Control. Please refer to Managing Connections using the Java SDK with Couchbase Server for more information on Capella and local cluster connections.

Running The Application

Directly on Machine

At this point, we have installed the dependencies, loaded the travel-sample data and configured the application with the credentials. The application is now ready and you can run it.

gradle bootRun

Note: If you're using Windows, you can run the application using the gradle.bat executable.

./gradew.bat bootRun

Using Docker

Build the Docker image

docker build -t java-springdata-quickstart .

Run the Docker image

docker run -d --name springdata-container -p 8080:8080 java-springdata-quickstart

Note: The application.properties file has the connection information to connect to your Capella cluster. These will be part of the environment variables in the Docker container.

Verifying the Application

Once the application starts, you can see the details of the application on the logs.

Application Startup

The application will run on port 8080 of your local machine (http://localhost:8080). You will find the interactive Swagger documentation of the API if you go to the URL in your browser. Swagger documentation is used in this demo to showcase the different API endpoints and how they can be invoked. More details on the Swagger documentation can be found in the appendix.

Swagger Documentation

Running Tests

To run the integration tests, use the following commands:

gradle test

Appendix

Data Model

For this quickstart, we use three collections, airport, airline and routes that contain sample airports, airlines and airline routes respectively. The routes collection connects the airports and airlines as seen in the figure below. We use these connections in the quickstart to generate airports that are directly connected and airlines connecting to a destination airport. Note that these are just examples to highlight how you can use SQL++ queries to join the collections.

travel-sample data model

Extending API by Adding New Entity

If you would like to add another entity to the APIs, these are the steps to follow:

  • You can create the collection using the SDK or via the Couchbase Server interface.
  • Create a new entity class in the models package similar to the existing entity classes like Airport.java.
  • Define the controller in a new file in the controllers folder similar to the existing classes like AirportController.java.
  • Define the service in a new file in the services folder similar to the existing classes like AirportService.java.
  • Define the repository in a new file in the repositories folder similar to the existing classes like AirportRepository.java.

Running Self-Managed Couchbase Cluster

If you are running this quickstart with a self-managed Couchbase cluster, you need to load the travel-sample data bucket in your cluster and generate the credentials for the bucket.

You need to update the connection string and the credentials in the application.properties file in the src/main/resources folder.

Note: Couchbase Server version 7 or higher must be installed and running before running the Spring Boot Java app.

Swagger Documentation

Swagger documentation provides a clear view of the API including endpoints, HTTP methods, request parameters, and response objects.

Click on an individual endpoint to expand it and see detailed information. This includes the endpoint's description, possible response status codes, and the request parameters it accepts.

Trying Out the API

You can try out an API by clicking on the "Try it out" button next to the endpoints.

  • Parameters: If an endpoint requires parameters, Swagger UI provides input boxes for you to fill in. This could include path parameters, query strings, headers, or the body of a POST/PUT request.

  • Execution: Once you've inputted all the necessary parameters, you can click the "Execute" button to make a live API call. Swagger UI will send the request to the API and display the response directly in the documentation. This includes the response code, response headers, and response body.

Models

Swagger documents the structure of request and response bodies using models. These models define the expected data structure using JSON schema and are extremely helpful in understanding what data to send and expect.