Sử dụng Optional PathVariable trong SpringMVC

Giới thiệu nội dung bài viết

Chào các em ,chủ đề hôm nay chúng ta sẽ nói về Spring Optional PathVariable sử dụng như thế nào.


1. PathVariable dùng để làm gì

Như các em đã thấy trong bài RequestMapping anh viết lần trước tại đây. Chúng ta sử dụng @PathVariable để mapping URI mà người dùng nhập trên trình duyệt vào Controller tương ứng.

Ví dụ anh có một controller có phương thức là getArticle sau.

1
2
3
4
5
6
7
8
@RequestMapping(value = {"/article", "/article/{id}"})
public Article getArticle(@PathVariable(name = "id") Integer articleId) {
    if (articleId != null) {
        //...
    } else {
        //...
    }
}

Ở đây chúng ta mong muốn khi người dùng gõ vào url là /article hay /article/id . Thì Spring sẽ tự động mapping vô method getArticle trong Controller.

Nếu ta có request là /article/123 thì mình gán giá trị 123 vô tham số articleId

Nếu ta có request là /article thì Spring sẽ trả về lỗi 500

1
2
org.springframework.web.bind.MissingPathVariableException:
  Missing URI template variable 'id' for method parameter of type Integer

Như vậy để làm sao mình không bị lỗi như trên . Giải pháp sẽ là dùng optional


2. Sử dụng Optional Parameter

Cũng ví dụ code về controller trên. Bây giờ ta thêm Optional vào

1
2
3
4
5
6
7
8
9
@RequestMapping(value = {"/article", "/article/{id}"}")
public Article getArticle(@PathVariable Optional<Integer> optionalArticleId) {
    if (optionalArticleId.isPresent()) {
        Integer articleId = optionalArticleId.get();
        //...
    } else {
        //...
    }
}

Ở ví dụ trên ta sử dụng Optional optiotalArticleId để mapping giá trị id từ request url của người dùng

Nếu ta có request là /article/123 thì mình gán giá trị 123 vô tham số optiontalArticleId

Nếu ta có request là /article thì optiontalArticleId sẽ là null. Khi sử dụng Optional ta sẽ cos được các method của Optional như isPresent(), get(), or orElse() để ta có thể truy cập và thao tác và xử lý theo ý ta mong


3. Kết luận

Mình không nên sử dụng @RequestMapping(value = {“/article”, “/article/{id}”}”) cho cùng một method vì nó dễ gây ra nhầm lẫn. Tốt nhất 1 request nên được xử lý bởi một method. Ta có thể tách ra như sau

1
2
3
4
5
6
7
8
9
@RequestMapping(value = "/article/{id}")
public Article getArticle(@PathVariable(name = "id") Integer articleId) {
    //...        
}

@RequestMapping(value = "/article")
public Article getDefaultArticle() {
    //...
}

4. Video Demo

5. Source code

Sourcecode


Mọi người hãy Subscribe kênh youtube dưới đây nhé để cập nhật các video mới nhất về kỹ thuật và kỹ năng mềm

Các khoá học lập trình MIỄN PHÍ tại đây


Comments