Spring Boot 要更新的Sping Boot 服务(PUT)

qfe3c7zg  于 2023-10-16  发布在  Spring
关注(0)|答案(3)|浏览(149)

我正在编写一个Sping Boot 服务层来更新一个Car实体-但问题是FindById方法的复杂性增加了,现在所有返回Optional<>的方法都集成了返回类型Dto而不是实体。
我知道Optional<>很好,因为它迫使开发人员处理未找到,但我打算稍后添加异常处理程序。

服务项目

@Override    
public CarCreateDto updateCar(CarCreateDto updateCarDto, Long id) {
    Optional<Car> CarOptional = CarRepository.findById(id);
    return CarOptional.map(Car -> {
        CarMapper.partialUpdate(updateCarDto, Car);
        return CarMapper.toDto(CarRepository.save(Car));
        });
}

上面的问题是,Optional<>通过Entity向上冒泡到Dto,导致当它期望Carbide Dto时返回Optional类型。
如何在服务层上最好地处理这个简单的更新方法,并使该方法返回Dto类型。

pcrecxhr

pcrecxhr1#

如果你不想返回Optional<>类型,用getById替换findById这个方法作为spring Boot 约定返回Car类型,然后将其Map到Dto。这可以是一种更简单的更新方法。

o8x7eapl

o8x7eapl2#

您可以使用Optional.map()进行操作。只有当可选的不为空时,才会调用任何操作。
如果存在值,则返回一个Optional描述(就像通过ofNullable(T))将给定Map函数应用于该值的结果,否则返回空Optional。如果Map函数返回null结果,则此方法返回空Optional。

public CarCreateDto updateCar(CarCreateDto updateCarDto, Long id) {
  Optional<Car> optionalCar = carRepository.getCarById(id);
  return optionalCar.map(car -> {
    carMapper.partialupdate(updateCarDto, car);
    return car;
  })
          .map(car -> repository.save(car))
          .map(car -> CarCreateDto.fromCar(car))//your actual mapping from car to dto here
          .orElseThrow(() -> new RuntimeException("not found"));
}

当前的处理是抛出异常,如果操作导致空可选(或初始值为空),但您可以使用orElseGet()orELse()来提供回退值,如果这是您的场景需要的话。
所有的Optional javadoc

ldioqlga

ldioqlga3#

你好,我想你正在努力实现像下面这样的东西-

public CarCreateDto updateCar(CarCreateDto updateCarDto, Long id) {
        Car car = carRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Car not found"));
    
        CarMapper.partialUpdate(updateCarDto, car);
        Car updatedCar = carRepository.save(car);
    
        return CarMapper.toDto(updatedCar);
}

相关问题