掘金 后端 ( ) • 2024-06-23 16:32

一个电子商务平台的商品管理功能。这个平台需要能够列出商品、创建新商品、更新现有商品、删除商品以及部分更新商品信息。可以通过@RequestMapping@GetMapping@PostMappingPutMappingDeleteMappingPatchMapping 注解来涵盖不同的 HTTP 方法和使用场景。

注解结构设计

image.png

URL API

电子商务平台商品的API,需要提供商品和订单的管理功能。

  • @GetMapping("/api/products") 用于获取商品列表。
  • @PostMapping("/api/products") 用于添加新商品。
  • @PutMapping("/api/products/{id}") 用于更新特定商品的详细信息。
  • @DeleteMapping("/api/products/{id}") 用于删除特定商品。
  • @GetMapping("/api/orders") 用于获取订单列表。
  • @PostMapping("/api/orders") 用于创建新订单。
  • @PatchMapping("/api/orders/{id}") 用于部分更新订单状态,如从 "pending" 改为 "shipped"。

这些注解的使用确保了 API 的 RESTful 风格,每个方法对应一种资源操作,使得 API 更加直观和易于使用。通过这种方式,你可以构建一个清晰、一致且易于维护的 Web API

案例:电子商务平台的商品管理

1. 控制器类定义

import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/api/products")
public class ProductController {

    private final ProductService productService = new ProductService();

    // 获取所有商品的列表
    @GetMapping
    public List<Product> getAllProducts() {
        return productService.findAllProducts();
    }

    // 创建新商品
    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return productService.createProduct(product);
    }

    // 根据商品ID获取商品详情
    @GetMapping("/{id}")
    public Product getProductById(@PathVariable Long id) {
        return productService.getProductById(id);
    }

    // 更新商品信息
    @PutMapping("/{id}")
    public Product updateProduct(@PathVariable Long id, @RequestBody Product updatedProduct) {
        return productService.updateProduct(id, updatedProduct);
    }

    // 删除商品
    @DeleteMapping("/{id}")
    public ResponseEntity<?> deleteProduct(@PathVariable Long id) {
        productService.deleteProduct(id);
        return ResponseEntity.ok().build();
    }

    // 部分更新商品信息
    @PatchMapping("/{id}")
    public Product patchProduct(@PathVariable Long id, @RequestBody Map<String, Object> updates) {
        return productService.patchProduct(id, updates);
    }
}

2. 服务层实现

import org.springframework.stereotype.Service;

@Service
public class ProductService {

    private final ProductRepository productRepository = new ProductRepository();

    public List<Product> findAllProducts() {
        return productRepository.findAll();
    }

    public Product createProduct(Product product) {
        return productRepository.save(product);
    }

    public Product getProductById(Long id) {
        return productRepository.findById(id).orElse(null);
    }

    public Product updateProduct(Long id, Product updatedProduct) {
        Product product = getProductById(id);
        if (product != null) {
            // 更新商品字段
            product.setName(updatedProduct.getName());
            product.setDescription(updatedProduct.getDescription());
            product.setPrice(updatedProduct.getPrice());
            return productRepository.save(product);
        }
        return null;
    }

    public void deleteProduct(Long id) {
        Product product = getProductById(id);
        if (product != null) {
            productRepository.delete(product);
        }
    }

    public Product patchProduct(Long id, Map<String, Object> updates) {
        Product product = getProductById(id);
        if (product != null) {
            updates.forEach((key, value) -> {
                switch (key) -> {
                    case "name" -> product.setName((String) value);
                    case "description" -> product.setDescription((String) value);
                    case "price" -> product.setPrice((Double) value);
                }
            });
            return productRepository.save(product);
        }
        return null;
    }
}

3. 存储层实现

import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
    // 这里可以定义自定义的数据库操作
}

4. 商品实体类

import javax.persistence.*;

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    private Double price;

    // 标准的 getter 和 setter
}

注解属性说明

@RequestMapping 注解属性作用解释:

  1. value:

    • 类型:String[]
    • 作用:指定请求的基础路径。可以是一个路径或多个路径的数组。
  2. path:

    • 类型:String[]
    • 作用:与 value 相同,用于指定请求的路径。path 是 value 的别名,两者不能同时使用。
  3. method:

    • 类型:RequestMethod[]
    • 作用:指定请求的 HTTP 方法。例如,RequestMethod.GETRequestMethod.POST 等。如果没有指定,将匹配所有方法。
  4. params:

    • 类型:String[]
    • 作用:指定请求必须满足的查询参数条件。例如,"params[] = {"param1", "param2"}
  5. headers:

    • 类型:String[]
    • 作用:指定请求必须满足的 HTTP 头部条件。例如,"headers[] = {"header1=value1", "header2=value2"}
  6. consumes:

    • 类型:String[]
    • 作用:指定请求正文(payload)支持的媒体类型。例如,"application/json""application/xml" 等。
  7. produces:

    • 类型:String[]
    • 作用:指定控制器方法支持返回的媒体类型。例如,"application/json""text/html" 等。
  8. name:

    • 类型:String
    • 作用:为映射定义一个名称,可用于文档生成或引用。

总结:

  • 通过使用 @RequestMapping@GetMapping@PostMapping@PutMapping@DeleteMapping 和 @PatchMapping 注解,这个控制器类提供了一个完整的商品管理功能,包括商品的增删改查和部分更新。
  • 这种方法的组织方式使得 API 直观且易于理解,每个 HTTP 方法对应一种资源操作。
  • 它支持 RESTful API 设计的最佳实践,提供了清晰的资源操作语义。