07/09/2018, 10:38

Tạo nhanh Restful API với Spring Boot và MongoDB

Chào mừng tất cả các bạn đến với bài viết đầu tiên trong năm mới Bính Thân 2016. Trong Series AngularJS cho người mới tôi đã từng đề cập rất nhiều đến Restful API, trong bài viết này tôi sẽ hướng dẫn các bạn xây dựng Restful API để trả dữ liệu về product cho frontend một cách nhanh nhất và đơn ...

Chào mừng tất cả các bạn đến với bài viết đầu tiên trong năm mới Bính Thân 2016. Trong Series AngularJS cho người mới tôi đã từng đề cập rất nhiều đến Restful API, trong bài viết này tôi sẽ hướng dẫn các bạn xây dựng Restful API để trả dữ liệu về product cho frontend một cách nhanh nhất và đơn giản nhất đối với những bạn đã quen thuộc với Java bằng Spring BootMongoDB.

Nào cùng bắt đầu.

Đầu tiên các bạn tạo project với gradle bằng bất cứ IDE nào mà các bạn quen thuộc.

File build.gradle các bạn khai báo như sau:

group 'com.codehub'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.2.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

repositories {
    mavenCentral()
}

jar {
    manifest {
        attributes 'Main-Class': 'com.codehub.demo.Application'
    }
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web:1.3.2.RELEASE'

    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Trong file này chúng ta khai báo các dependency, build script,… cũng như file main để chạy application.

Sau đó chúng ta khởi tạo file để chạy application, trong pakage com.codehub.demo ta tạo file Application.java như sau:

@SpringBootApplication
public class Application {

    public static void main (String... args) {
        SpringApplication.run(Application.class, args);
    }

}

Đây chính là file để chạy application, từ đây chúng ta sẽ có root của application, Spring boot sẽ tự động scan các component từ package khai báo với annotation @SpringBootApplication trở xuống.

Annotation @SpringBootApplication là cách viết ngắn gọn của việc khai báo bằng các annotation sau.

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

Tiếp theo ta tạo model dữ liệu. Tạo package com.codehub.demo.model trong đây chúng ta sẽ khai báo các model cho application. Chúng ta khai báo model Product như sau.

public class Product implements Serializable {

    private String id;
    private String name;

    public Product(String id, String name) {
        this.id = id;
        this.name = name;
    }

    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;
    }

}

Ở đây tôi khai báo model Product với hai thuộc tính đơn giản là id và name.

Tiếp đến ta tạo controller. Tạo package com.codehub.demo.controller, tại đây khai báo các controller. Chúng ta tạo ProductController với path là /products như sau.

@RestController
@RequestMapping(value = "/products")
public class ProductsController {

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public String test() {
        return "OK";
    }

}

Trong ProductsController tạo API để test với path là /test. Như vậy ta sẽ gọi /products/test để gọi API này.

Bây giờ các bạn đã có thể start để xem Restful API của chúng ta chạy như thế nào. Chạy file Application.java. Sau khi chạy các bạn chú ý log từ Spring Boot các bạn sẽ thấy.

INFO 7620 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1da51a35: startup date [Tue Feb 09 20:37:37 ICT 2016]; root of context hierarchy
INFO 7620 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/products/test],methods=[GET]}" onto public java.lang.String com.codehub.demo.controller.ProductsController.test()

Spring Boot sẽ scan tất cả các file từ file main application trở xuống và sẽ check xem nêú file đó được mark với annotation @Controller hay @RestController để mapping với path tương ứng được khai báo. Nếu các bạn không thấy đoạn log tương tự có nghĩa là các bạn đang có vấn đề về scope khai báo các file controller.

Nếu các bạn check log đã ổn, bây giờ thử gọi localhost:8080/products/test để kiểm tra xem application của chúng ta đã hoạt động.

Tiếp theo application của chúng ta đã chạy ổn thì chúng ta sẽ giải quyết tiếp đến phần dữ liệu sử dụng MongoDB.

Đầu tiên add thêm dependency để sử dụng Spring Data với MongoDB như sau.

compile 'org.springframework.boot:spring-boot-starter-data-mongodb:1.3.2.RELEASE'

Nếu bạn chưa cài đặt MongoDB và đang sử dụng Mac OS cài đặt bằng lệnh brew install mongodb. Nếu các bạn muốn manual install thì các bạn có thể tải về tại https://www.mongodb.com/download-center.

Bây giờ các bạn tạo một interface để tương tác với MongoDB. Tạo package com.codehub.demo.domain để chứa các thành phần thuộc về domain của application, trong package này tạo interface ProductRepository như sau.

public interface ProductRepository extends MongoRepository<Product, String> {

}

Khi khai báo MongoRepository<Product, String> tương ứng bên trái là kiểu của collection bên phải là kiểu của id, Spring Data sẽ tự map repository với collection tương ứng trong MongoDB, interface này sẽ cung cấp cho các bạn hầu hết các phương thức cần dùng để tương tác với MongoDB. Và mặc định connection với MongoDB sẽ là localhost:27017 port mặc định của MongoDB sau khi cài đặt, nếu các bạn muốn custom thông tin connection các bạn có thể tham khảo ở đây http://docs.spring.io/spring-data/mongodb/docs/1.2.x/reference/html/mapping-chapter.html.

Ngoài ra các bạn đang thắc mắc vậy id sẽ được map như thế nào với object. Spring Data giúp các bạn map field trong object Java với id trong MongoDB bằng annotation @Id sử dụng như sau.

@Id
private String id;

Tiếp theo các bạn khai báo service. Tạo package com.codehub.demo.service để chứ các file khai báo service. Tạo file ProductService như sau.

@Service
public class ProductService {

    @Autowired
    private ProductRepository repository;

    public List getProducts() {
        return repository.findAll();
    }
}

Cuối cùng apply service vào trong controller, sử dụng dependency injection như sau:

@Autowired
private ProductService productService;

@RequestMapping(value = "/all", method = RequestMethod.GET)
public List getProducts() {
    return productService.getProducts();
}

Bây giờ thử chạy lại application và gọi localhost:8080/products/all xem nào. Kết quả trả về rỗng ([]) đúng không nào. Giờ vào MongoDB và insert một vài data xem sao. Trong terminal các bạn gõ mongo để và mongo cli. Thêm một vài product bằng lệnh db.product.insert({name: ‘iPhone 6s’}).

Bây giờ thử gọi lại và các bạn sẽ thấy kết quả như sau:

[
  {
    "id": "56b9ee1ca182b73ed5ef5502",
    "name": "iPhone 6s"
  },
  {
    "id": "56b9ee23a182b73ed5ef5503",
    "name": "iPhone 6s Plus"
  }
]

Ngoài ra, với xu thế sử dụng microservices thì việc health check các service là khá thường xuyên tuy nhiên chúng ta không nên để nhưng api dạng như /test trong code vì như thế làm code khá là xấu. Spring đưa cho chúng ta module spring-boot-starter-actuator, module này cung cấp cho các bạn khá nhiều tiện ích để monitor module như health check, metrics, mappings

Hy vọng qua bài này các bạn đã có thể tự build cho mình một Restful API bằng Spring Boot và MongoDB một cách nhanh nhất.

Source code trong bài các bạn có thể tìm thấy ở đây https://github.com/codehub-vn/springboot-mongodb-demo.

Nguồn: codeholicguy.com

0