Spring JPA从findById()创建ResponseEntity

时间:2018-06-09 18:25:39

标签: java spring spring-boot java-8 spring-data-jpa

在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);
});

有人能告诉我返回正确回复的正确方法是什么?

感谢您的帮助!

3 个答案:

答案 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 它有一个整洁的设计解决方案! 希望它会有所帮助!