在Spring启动应用程序中,我有一个端点,如果它存在,则返回带有对象的HTTP 200响应,否则返回HTTP 404响应。使用spring-boot-starter-parent 1.5.7我曾经这样做:
@Autowired private GroceryRepository groceryRepository;
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public ResponseEntity<Object> get(@PathVariable final Integer id) {
final Grocery grocery = groceryRepository.findOne(id);
if (null == grocery) {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(MessageUtil.parse(MSG_404_GROCERY, id + ""));
}
return ResponseEntity.ok(grocery);
}
GroceryRepository extends JpaRepository<Grocery, Integer>
在spring-boot-starter-parent 2.0.0中,findOne()
已从JpaRepository中消失,findById()
返回Optional
。我在如何“移植”上面的代码方面有点挣扎。以下内容未构建,因为它具有意外的返回类型:
groceryRepository.findById(id).ifPresent(grocery -> {
return ResponseEntity.ok(grocery);
});
有人能告诉我返回正确回复的正确方法是什么?
感谢您的帮助!
答案 0 :(得分:3)
ifPresent有一个void
返回类型,因此执行return ResponseEntity.ok(grocery);
将无法正常工作。
那就是说,Optional有一个isPresent()方法可以使用:
Optional<Grocery> groceryOptional = groceryRepository.findById(id);
if(groceryOptional.isPresent()){
return ResponseEntity.ok(groceryOptional.get());
}else {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(MessageUtil.parse(MSG_404_GROCERY, id + ""));
}
另一种方法是:
Optional<Grocery> groceryOptional = groceryRepository.findById(id);
return groceryOptional.map(e -> ResponseEntity.ok(e))
.orElse(ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(MessageUtil.parse(MSG_404_GROCERY, id + "")));
答案 1 :(得分:2)
即使上面的答案是正确的,我也会寻求更好的功能解决方案。
而不是调用Optional#isPresent
来检查Grocery
对象是否存在,我会这样:
public ResponseEntity<Object> get(@PathVariable final Integer id) {
return groceryRepository.findOne(id)
.map(g -> ResponseEntity.ok(g))
.orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).body(MessageUtil.parse(MSG_404_GROCERY, id + ""));
}
答案 2 :(得分:0)
我在以下Stackoverflow链接中找到了您的问题的解决方法
How to properly handle empty resultset with Hibernate and Spring Boot 它有一个整洁的设计解决方案! 希望它会有所帮助!