【问题标题】:Change in RequestMapping method or post addition of Optional in Java 8 from Java 7从 Java 7 更改 RequestMapping 方法或在 Java 8 中添加 Optional
【发布时间】:2019-04-21 09:44:19
【问题描述】:

我一直在尝试遵循一个教程,其中他们基本上使用的是 java 7,目前我正在使用 java 8 环境,所以我想知道我正在尝试使用的代码的 java8 版本是什么on - 目前我在使用 Optional 时遇到了很多错误,eclipse 建议我修复一些初始错误,但我遇到了一些错误。

java7代码如下:

@RequestMapping("/reservations")
    public Reservation updateReservation1(ReservationUpdateRequest request) {
        Reservation reservation = reservationRepo.findOne(request.getId());
        reservation.setNumberOfBags((request.getNumOfBags());
        reservation.setCheckedIn(request.getCheckedIn());
        return reservationRepo.save(reservation);
    }

java8 出错

@RequestMapping("/reservations")
    public Optional<Reservation> updateReservation(ReservationUpdateRequest request) {
        Optional<Reservation> reservation = reservationRepo.findById(request.getId());
        reservation.setNumberOfBags((request.getNumOfBags());
        reservation.setCheckedIn(request.getCheckedIn());
        return reservationRepo.save(reservation);
    }

在 java8 代码中,eclipse ide 在第 3 行给了我错误-即当我尝试将值设置为 reservation.setNumberOfBags() 时,它显示 The method setNumberOfBags(int) is undefined for the type Optional&lt;Reservation&gt;-如果有人可以提供帮助?

【问题讨论】:

  • reservation 是一个Optional,因此您必须调用get 方法来获取实际值。但是,您应该首先使用isPresent 检查下面的值是否不为空,并根据此条件应用处理。
  • 我想补充一点,您的 REST 非常糟糕。你不应该使用 Request 对象。 @PutMapping(value="/reservations/{resId}") public Optional&lt;Reservation&gt; updateReservation(Reservation patchReservation, @PathParameter int resId) {
  • 你在尝试随机的东西。那不会把你带到任何地方。相反,请阅读 Optional 的 javadoc。谷歌查找解释什么是 Optional 以及如何使用它的文章(有很多)。 Optional 的全部意义在于强制您考虑如果具有给定 ID 的实体不存在您应该做什么。所以你必须先做出决定。
  • @michalk 这实际上是使用 isPresent/get 模式来使用 Optional 的反模式(除非没有其他方法)。应该通过使用 map/flatMap/filter 将可选性检查委托给 Optional 本身来进行处理
  • @manisjos 因为更新操作应该使用PUT http 动词,而不是GET,这是RequestMapping 的默认值

标签: java spring java-8 java-7


【解决方案1】:

你应该返回Reservation而不是Optional&lt;Reservation&gt;(我猜你使用的是Spring Data,请看save方法)。

如果要在未找到预留时抛出异常,请使用:

public Reservation updateReservation(ReservationUpdateRequest request) {
        Reservation reservation = reservationRepo.findById(request.getId())
            .orElseThrow(() -> new EntityNotFoundException("Reservation not found"));
        reservation.setNumberOfBags(request.getNumOfBags());
        reservation.setCheckedIn(request.getCheckedIn());
        return reservationRepo.save(reservation);
    }

如果您想在未找到时返回 404 错误代码:

public ResponseEntity<Reservation> updateReservation(ReservationUpdateRequest request) {
     return reservationRepo.findById(request.getId())
         .map(r -> {
              r.setNumberOfBags(request.getNumOfBags());
              r.setCheckedIn(request.getCheckedIn());
              return ResponseEntity.ok().body(reservationRepo.save(r));
          }).orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

而且 RequestMapping 很奇怪,你应该在 URL 中使用带有 id 的 PUT 而不是请求正文。

@PutMapping("/reservations/{id}")
public ResponseEntity<Reservation> updateReservation(@PathParam("id") Long id, ReservationUpdateRequest request) {
     return reservationRepo.findById(id)
         .map(r -> {
             r.setNumberOfBags(request.getNumOfBags());
             r.setCheckedIn(request.getCheckedIn());
             return ResponseEntity.ok().body(reservationRepo.save(r));
         }).orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

【讨论】:

    【解决方案2】:
    @RequestMapping("/reservations")
    public Optional<Reservation> updateReservation(ReservationUpdateRequest request) {
        Optional<Reservation> reservation = reservationRepo.findById(request.getId());
        if(reservation.isPresent()) {
            Reservation actReservation = reservation.get();
            actReservation .setNumberOfBags((request.getNumOfBags());
            actReservation .setCheckedIn(request.getCheckedIn());
            return reservationRepo.save(actReservation );
        }
        else {
            return Optional.empty();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多