9

First steps to build Spring Boot Application with Couchbase

 2 years ago
source link: https://blog.knoldus.com/spring-boot-application-with-couchbase/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

First steps to build Spring Boot Application with Couchbase

Reading Time: 2 minutes

As the name of the blog suggests, we will be taking the first steps to build a simple application from scratch using Couchbase as a database and spring -boot as a framework. Let’s get started.

You can create a starter maven project using this link.
Add Web, Lombok and Couchbase dependencies. The pom.xml should look like:

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.3.RELEASE</version>

</parent>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-couchbase</artifactId>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</dependency>

<dependency>

<groupId>javax.validation</groupId>

<artifactId>validation-api</artifactId>

</dependency>

Let’s run the spring boot application:

  1. How to download and run Couchbase from here.
  2. mvn spring-boot:run

Let’s add an entity class representing JSON document which we want to persist:

package com.knoldus.blogs.models;

import com.couchbase.client.java.repository.annotation.Field;

import com.couchbase.client.java.repository.annotation.Id;

import lombok.AllArgsConstructor;

import lombok.Builder;

import lombok.Data;

import org.springframework.data.couchbase.core.mapping.Document;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;

import java.util.Date;

import java.util.List;

@Builder

@Data

@AllArgsConstructor

@Document

public class Blogs {

@Id

final String id;

@Size(min=10)

@NotNull

@Field

String topic;

@NotNull

@Field

String author;

@Field

List<String> tags;

@Field

Date date;

}

Please notice the annotations which we have used in the Data Model define above.

@Document: Identifies a domain object to be persisted to Couchbase.
@Id: Identifies a field which will not be stored in the document but rather used as the                      document ID
@Field: Denotes a field in the Couchbase document.

Creating Repository:

Spring framework provides an interface for generic CRUD operations on a repository for a specific type which we can readily use to perform basic CRUD operations

public interface BlogRepository extends CrudRepository<Blog, String> {
   
}

We can even add derivable query methods in the repository, for example,

Blogs findByAuthor(String author);

List deleteBytopicAndAuthor(String title, String author);

You can read more about derivable queries from here.

For integrating the repository with the rest API to be able to perform CRUD operations, we need to define a controller class.

package com.knoldus.blogs.controller;

import com.knoldus.blogs.models.Blogs;

import com.knoldus.blogs.models.BlogsUpdateRequest;

import com.knoldus.blogs.repository.BlogRepository;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.DeleteMapping;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.PutMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

import java.util.Optional;

@RestController

public class BlogController {

@Autowired

BlogRepository blogRepository;

@RequestMapping("/")

public String index() {

return "Welcome to the CRUD application!!";

}

@PostMapping("/blogs")

public Blogs addBlogPost(@RequestBody Blogs newBlog) {

return blogRepository.save(newBlog);

}

@GetMapping("/blogs/{id}")

public Optional<Blogs> getBlog(@PathVariable String id) {

if (blogRepository.existsById(id)) {

return blogRepository.findById(id);

} else

return Optional.empty();

}

@GetMapping("/blogs/author/{author}")

public Blogs getBlogByAuthorName(@PathVariable String author) {

return blogRepository.findByAuthor(author);

}

@DeleteMapping("/blogs/topic/{topic}/author/{author}")

public List<Blogs> deleteByAuthorAndTopic(@PathVariable String topic, @PathVariable String author) {

return blogRepository.deleteBytopicAndAuthor(topic, author);

}

@DeleteMapping("/blogs/{id}")

public void deleteById(@PathVariable String id) {

blogRepository.deleteById(id);

}

@PutMapping("/blogs/{idToBeUpdated}")

public String updateBlog(@PathVariable String idToBeUpdated, @RequestBody BlogsUpdateRequest blogsUpdateRequest) {

Optional<Blogs> mayBeBlog = blogRepository.findById(idToBeUpdated)

.map(blogs –> blogRepository

.save(Blogs

.builder()

.id(idToBeUpdated)

.topic(blogsUpdateRequest.getTopic())

.tags(blogsUpdateRequest.getTags())

.author(blogs.getAuthor())

.date(blogs.getDate())

.build())

);

if (mayBeBlog.isPresent()) {

return "Blog Updated";

} else {

return "Blog does not exist";

}

}

}

We have used @Autowired annotation on BlogRepository. When the annotation is used on a constructor, an instance of BlogRepository is injected as an argument to the constructor when BlogController is created.

Adding Couchbase configurations:

package com.knoldus.blogs;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;

import java.util.Collections;

import java.util.List;

@Configuration

public class Config extends AbstractCouchbaseConfiguration {

@Override

protected List<String> getBootstrapHosts() {

return Collections.singletonList("127.0.0.1");

}

@Override

protected String getBucketName() {

return "blog";

}

@Override

protected String getBucketPassword() {

return "knoldus";

}

@Override

protected String getUsername() {

return "Administrator";

}

}

Before running our application we need to create a bucket in Couchbase and also create a primary index to be able to query on all fields.

Finally, we are ready to run our application and perform all the crud operations!
Find the complete code here. Refer to Readme.md for all the request samples.

I hope you enjoyed reading the blog. Thanks.
Happy blogging!!

References:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK