You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot服务报错:无法调用Optional对象的setTotalStockQuantity方法

问题分析与解决

错误原因

你遇到的IDE报错是因为productInStock是Optional<Stock>类型,它作为容器类本身并没有setTotalStockQuantity()方法,必须先取出其中包裹的Stock实体对象才能调用对应的方法。另外代码里还有一个变量未定义的问题:if分支中的stockRepository.save(stock);里的stock变量从未声明过。

修正后的代码

private final TransactionRepository transactionRepository;
private final StockRepository stockRepository;

public Transaction saveNewProduct(Transaction transaction) {
    Long productId = transaction.getProduct().getId();
    Integer newProductQuantity = transaction.getQuantity();
    Optional<Stock> productInStock = stockRepository.findByProductId(productId);
    
    if(productInStock.isPresent()) {
        // 取出Optional中的Stock实体
        Stock existingStock = productInStock.get();
        // 直接从已获取的实体中读取当前库存,避免重复查询数据库
        Integer updatedProductQuantity = existingStock.getTotalStockQuantity() + newProductQuantity;
        existingStock.setTotalStockQuantity(updatedProductQuantity);
        // 保存更新后的现有库存实体
        stockRepository.save(existingStock);
    } else {
        Stock stock = new Stock();
        stock.setProduct(transaction.getProduct());
        stock.setTotalStockQuantity(transaction.getQuantity());
        stockRepository.save(stock);
    }
    
    return transactionRepository.save(transaction);
}

关键修改点

  • 从Optional<Stock>中通过get()方法获取实际的Stock实体对象existingStock,再对其进行属性修改
  • 移除了多余的stockRepository.findTotalStockQuantityByProductId(productId)查询,直接从已加载的existingStock中获取当前库存数量,减少数据库交互开销
  • 修正了保存时的变量引用,使用已获取的existingStock而非未定义的stock变量

内容的提问来源于stack exchange,提问作者Ilmars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:25:01