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.
Như các em đã thấy trong bài RequestMaping 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
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
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
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() {
//...
}