Jacobvu84 / developer-career

Study for interview
1 stars 0 forks source link

Day 02 Tìm hiểu @PutMapping #12

Open Jacobvu84 opened 2 years ago

Jacobvu84 commented 2 years ago
   @PutMapping("/{id}")
    ResponseEntity<ResponseObject> updateProduct(@RequestBody Product newProduct, @PathVariable Long id){

       List<Product> products = repository.findByProductId(id);

        for(Product product: products) {
            if(product.getProductId()==id){
                product.setName(newProduct.getName());
                product.setYearOfManufacture(newProduct.getYearOfManufacture());
                product.setPrice(newProduct.getPrice());
                product.setUrl(newProduct.getUrl());
                return ResponseEntity.status(HttpStatus.OK).body(
                        new ResponseObject("ok", "update successfully", repository.save(product))
                );
            }

        }
        return ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(
                new ResponseObject("failed", "product id not found", ""));
    }
Jacobvu84 commented 2 years ago

Cách 2 Sử dụng những hàm sẵn có trong JpaRepository

Chúng ta viết thêm hàm findById trong ProductRepository. Theo convention chúng ta cần đặt tên hàm đúng theo quy định của Spring. Bắt đầu bằng tiền tố findBy theo sau là tên thuộc tính của Entity.

Điều này rất nhanh giúp chúng ta có được hàm findByProductId mà không cần implement thêm gì.

Thế mới gọi là frameowork chứ. Nếu ko cái gì cũng làm từ đầu như "My framework" thì còn gọi gì là framework nữa. 🥇

public interface ProductRepository extends JpaRepository<Product, Long> {

    // Name method needs to follow convention: findBy<nameAttribute>
    List<Product> findByName(String name);

    List<Product> findByProductId(Long id);

}

Đưới đây là đoạn code để update thông tin cho một product.

   @PutMapping("/{id}")
    ResponseEntity<ResponseObject> updateProduct(@RequestBody Product newProduct, @PathVariable Long id){

        Optional<Object> foundProduct = repository.findById(id).map(
                product -> {
                    product.setName(newProduct.getName());
                    product.setPrice(newProduct.getPrice());
                    product.setYearOfManufacture(newProduct.getYearOfManufacture());
                    product.setUrl(newProduct.getUrl());
                    return repository.save(product);
                }
        );

        return foundProduct.isPresent() ?
            ResponseEntity.status(HttpStatus.OK).body(
                    new ResponseObject("ok", "Update product successfully", foundProduct)
            ):
            ResponseEntity.status(HttpStatus.NOT_IMPLEMENTED).body(
                    new ResponseObject("failed", "product not found", "")
            );
        }

Dữ liệu test dùng cho Postman

{
    "name": "BPhone Pro",
    "yearOfManufacture": 2500,
    "price": 5000,
    "url": ""
}
Jacobvu84 commented 2 years ago

Ta dùng Optional<Product> vì tránh trường hợp không tìm thấy record product nào trong database nó sẽ trả về tham chiếu Null, điều này sẽ dẫn đến một NullPointerException. Để ngăn chặn điều này chúng ta có thể dùng Optional (java8)

Optional là một container cho phép chứa một giá trị vắng mặt.