Правильный способ записи ResponseEntity с помощью @RestController для api Spring RESTful

#spring #spring-boot #spring-data-jpa

Вопрос:

 @RestController
public class TestController {
    @GetMapping(path = "/demo")
    public ResponseEntity<?> test() {
        User user = new User();
        user.setAge("12");
        HttpHeaders responseHeaders = new HttpHeaders();
        return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);
    }
}
 

Я заглядываю в некоторые документы и нахожу, что некоторые люди напишут, как показано ниже:
rResponseEntity.ok().headers(responseHeaders).body(user);

В чем разница между new ResponseEntity<>(user, responseHeaders, HttpStatus.OK); и ResponseEntity.ok().headers(responseHeaders).body(user); ? Какой путь предпочтительнее? Спасибо.

Комментарии:

1. Там нет рекомендуемого подхода, АФАИК, используйте тот, который вы предпочитаете. Второй вариант через конструктор, возможно, легче читать, но это вопрос предпочтений.

2. Почему мы можем писать в ResponseEntity.ok().headers(responseHeaders).body(user); ? Есть ли здесь какая-то логическая поддержка?

3. Нет, это просто следует шаблону строителя с .body(user) последующим вызовом new ResponseEntity<>(...) .

4. Я предпочитаю, чтобы метод возвращал тип напрямую ( User в вашем примере) и использовал исключения (например ResponseStatusException ), если что-то пойдет не так. Но, как уже сказал @sp00m, на самом деле это дело вкуса.

5. @slauth Как мне изменить код, если я использую исключения? Спасибо.

Ответ №1:

Я показываю небольшой пример, возвращающий User напрямую, потому что ИМХО это приводит к более чистым подписям:

 @RestController
public class TestController {
    
    @GetMapping(path = "/demo")
    public User test() {
        if (userDoesNotExist()) {
            throw new ResponseStatusException(HttpStatus.NOT_FOUND);
        }
        User user = new User();
        user.setAge("12");
        return user;
    }
}