从 Java 7 更改 Java 8 中的 RequestMapping 方法或添加可选

nig*_*ury 2 java spring java-7 java-8

我一直在尝试遵循一个教程,其中他们基本上使用 java 7,目前我正在 java 8 环境上工作,所以我想知道我正在尝试处理的代码的 java8 版本是什么 - 目前我收到很多错误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);
    }
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

在java8代码中,eclipse ide在第3行给了我错误 - 也就是说当我试图将值设置到reservation.setNumberOfBags()它显示时The method setNumberOfBags(int) is undefined for the type Optional<Reservation>- 如果有人可以帮忙吗?

Pat*_*die 5

你应该 returnReservation而不是Optional<Reservation>(我猜你正在使用 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);
    }
Run Code Online (Sandbox Code Playgroud)

如果您想在未找到时返回 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));
    }
Run Code Online (Sandbox Code Playgroud)

而且 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));
}
Run Code Online (Sandbox Code Playgroud)