上一篇主要實作列出所有資料的 API,不過撈取資料時,使用關鍵字或是序號來找尋也是很常見的,所以今天將會實作如何透過 id 來撈取到對應的資料內容~
return type of the method is PostDto and the method is getPostById()
PostService.java
PostDto getPostById(long id);
PostServiceimpl.java
這邊使用 ResourceNotFoundException() 來處理當找不到該 id 的值的狀況
public PostDto getPostById(long id) { // lambda expression to implement function supplier
Post post = postRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Post","id",id));
return mapToDTO(post);
}
以上這樣會出錯,因為 ResourceNotFoundException() 在宣告時給的參數型態是 String 不是 long。
解決方法:
改 ResourceNotFoundException() 這個 function 的參數 type,可以雙擊這個 function,就會連到 function 建立的地方,再將有 fieldValue 的宣告或是呼叫的 type 改成 long
可以參考:
public class ResourceNotFoundException extends RuntimeException{
private String resourceName;
private String fieldName;
// Change for the type
private long filedValue;
// Create Constructor
// Change for the type
public ResourceNotFoundException(String resourceName, String fieldName, long filedValue) {
super(String.format("%s Can't find %s: '%%",resourceName,fieldName,filedValue));
this.resourceName = resourceName;
this.fieldName = fieldName;
this.filedValue = filedValue;
}
// 建立 Getter and Setter
public String getResourceName() {
return resourceName;
}
public String getFieldName() {
return fieldName;
}
// Change for the type
public long getFiledValue() {
return filedValue;
}
}
這樣就不會出錯了喔~
此外,也要記得 import com.spring.blog.exception.ResourceNotFoundException;
在 Controller 層建立 API 的 url path
PostController.java
@GetMapping("/{id}")
public ResponseEntity<PostDto> getPostById(@PathVariable(name="id") long id){
return ResponseEntity.ok(postService.getPostById(id));
}
使用 http://localhost:8080/api/posts/1
,並選擇 GET 的方式,按下 send 後就會顯示出資料的喔~
除了新增、查詢等功能外,常見的還有更新資料的使用,明天將會介紹如何使用 REST API 來 update 資料~
若文中有錯誤之處還請多多包涵與指正,也歡迎在文章下方留言討論!
明天見~