Spring JPA Создать ResponseEntity из findById () - PullRequest
0 голосов
/ 09 июня 2018

В приложении весенней загрузки у меня есть конечная точка, которая возвращает ответ 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 голосов
/ 09 июня 2018

Даже если приведенный выше ответ верен, я бы выбрал еще более функциональное решение.

Вместо вызова 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 + ""));

}
0 голосов
/ 09 июня 2018

Я нашел решение для вашей проблемы в следующей ссылке Stackoverflow

Как правильно обрабатывать пустой набор результатов с помощью Hibernate и Spring Boot У него есть продуманное решение для этого!Надеюсь, это поможет!

0 голосов
/ 09 июня 2018

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 + "")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...