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