繁体   English   中英

可选 vs 异常,控制器 vs 服务

[英]Optional vs exceptions, controllers vs services

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

  1. 服务返回可选值和控制器处理不存在的情况
  2. 服务直接处理不存在的情况,如果存在则返回真实的 object,如果不存在则抛出异常

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

例如。 选项 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)
        );
    }

选项二: 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,它最终会在相应的最终用户友好消息中转换此异常。 所以他们都“工作相同”

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

因此,我认为您应该 go这两种方法都不是,而是编码您的 controller 以便能够处理“未找到”响应的返回值。 (这是一个空列表、一个特殊的 object 类型,还是简单null取决于您的实现最容易支持的类型。)

对于服务方法,我会拨打 go,因为这将为您提供更大的灵活性。 在某些情况下,您需要操纵来自数据库的响应并应用变通方法。 您可以在服务部分应用此逻辑。

首选2,处理空值是业务逻辑的一部分,应该在服务中处理,

这种方法可以在您的应用程序的其他地方重复使用

必要时也仅在特定情况下使用 Optional

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM