gpt4 book ai didi

java - 可选与异常(exception), Controller 与服务

转载 作者:行者123 更新时间:2023-12-01 16:41:43 25 4
gpt4 key购买 nike

我有JAVA设计考虑:我在选择之间挣扎:

  1. 服务返回可选值和 Controller 处理不存在的情况
  2. 服务直接处理不存在的案例,如果存在则返回真实对象,如果不存在则抛出异常

是否有好的做法可以帮助我在这两种方法之间进行选择?

例如。 选项 1 Controller :

public ResponseEntity<Product> findProductById(@PathVariable Long productId) {
return this.productService.getProductById(productId).map(
p -> ResponseEntity.ok(p)
).orElseThrow(() -> new ResourceNotFoundException(ResourceType.PRODUCT, "Id", productId.toString()));
}

服务:

    public Optional<Product> getProductById(Long id) {
return productRepository.findById(id).map(
product -> someLogic(product)
);
}

选项 2: Controller

    public ResponseEntity<Product> findProductById(@PathVariable Long productId) {
return ResponseEntity.ok(productService.getProductById(productId));
}

服务

    public Product getProductById(Long id) {
return productRepository.findById(id).map(
product -> lazyLoadProduct(product)
).orElseThrow(() -> new ResourceNotFoundException(ResourceType.PRODUCT, "Id", id.toString()));;
}

对于这两种方法,我有一个 ControllerAdvice,它最终会在相应的最终用户友好消息中转换此异常。所以它们都“工作相同”

最佳答案

仅当出现意外事件或需要与核心业务逻辑分开处理的情况时才应抛出异常。搜索资源时,未找到该资源的事件是预期结果,因此并不异常(exception)。

因此,我认为您不应该采用这些方法,而是对您的 Controller 进行编码,使其能够处理“未找到”响应的返回值。 (这是一个空列表、特殊对象类型还是简单的 null 取决于您的实现最容易支持的类型。)

关于java - 可选与异常(exception), Controller 与服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61849188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com