可选vs例外,控制器vs服务

问题描述 投票:0回答:3

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

  1. services返回可选值,并且controllers >>处理无本案
  2. services
  3. 直接处理不存在的案件,如果存在则返回真实对象,否则返回异常

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

例如选项1

控制器:
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:

控制器
    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。所以他们都“一样工作”

我有JAVA设计方面的考虑:我在以下选择之间挣扎:服务返回可选值和处理非当前案例的控制器服务直接处理非当前案例,...

java design-patterns service controller optional
3个回答
0
投票

我会选择服务方法,因为这将为您提供更大的灵活性。在某些情况下,您需要处理来自数据库的响应并应用变通办法。您可以在服务部分中应用此逻辑。


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.