Как принять аргумент GET в Spring boot Controller и вернуть соответствующий объект

Вы можете использовать функцию jQuery.getScript() ... Я думаю, вам будет намного легче с этим включить файл JavaScript .js.

Здесь является ссылкой.

1
задан Nalin Kamboj 13 July 2018 в 10:19
поделиться

2 ответа

Это мой типичный код контроллера REST для запроса «получить пользователя по id»:

@RestController
@RequestMapping("/users") // 1
public class UserController {

    private final UserRepo userRepo;

    public UserController(UserRepo userRepo) {
        this.userRepo = userRepo;
    }

    @GetMapping("/{id}") // 2
    public ResponseEntity getById(@PathVariable("id") Long id) { // 3
        return userRepo.findById(id) // 4
                .map(UserResource::new) // 5
                .map(ResponseEntity::ok) // 6
                .orElse(ResponseEntity.notFound().build()); // 7
    }
}

Где:

1 - общий пусковой путь для всех запросов управляемый этим контроллером

2 - шаблон переменной пути запроса GET (/users/{id}).

3 - укажите имя переменной пути, имя которой соответствует параметру в GetMapping. Тип параметра в методе getById соответствует типу User ID.

4 - Я использую метод findById для моего UserRepo, который возвращает Optional

5 - Здесь я преобразовываю User в некоторый тип DTO - UserResource (это необязательный шаг)

6 - возвращает OK ответ, если User найдено

7 - или вернуть ответ Not Found в противном случае.

3
ответ дан Cepr0 17 August 2018 в 13:10
поделиться
  • 1
    Вы также можете вернуть POJO (простой старый Java-объект) из метода контроллера в Spring Boot (либо аннотировать класс с помощью @RestController, либо аннотировать метод с помощью @ResponseBody) и сериализовать его в JSON. Вы также можете установить статус ответа с помощью @ResponseStatus для успешных ответов, например HttpStatus.NOT_FOUND – Jordan Mackie 13 July 2018 в 12:25
  • 2
    @JordanMackie Я знаю - но мне нравится мой стиль;) Я думаю, что будет здорово, если вы предоставите свой полный вариант, чтобы продемонстрировать неоновые пути Налина ... – Cepr0 13 July 2018 в 12:29
  • 3
    оба полностью прекрасные! Просто подумал, что я его добавлю. Я также добавлю отдельный ответ. – Jordan Mackie 13 July 2018 в 12:30
  • 4
    Ключ «не найден». (HTTP 404) для случая 1. Spring MVC дает вам несколько способов сделать это. Для меня ResponseEntity, как показано здесь, кажется наиболее мощным и amp; полезно, но другой подход тоже работает. – dbreaux 13 July 2018 в 13:36

Я также использую шаблон контроллера-службы-репозитория в нескольких проектах, и вот как я его выкладываю:

Controller.java

@RestController // 1
@RequestMapping(value = "/users")  // 2
public class UserController {

    private final UserService userService;

    @Autowired // 3
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping(value = "/{user_id}", method = RequestMethod.GET) //4
    @ResponseStatus(HttpStatus.OK) //5
    public UserModel getUser(@PathVariable(value="user_id") long user_id) { //6
        return userService.getUserById(user_id);
    }

    @RequestMapping(method = RequestMethod.POST) // 7
    @ResponseStatus(HttpStatus.CREATED) // 8
    public UserModel getUser(@ResponseBody UserModel userModel) { // 9
        return userService.createUser(usermodel);
    }

}

1) @RestController представляет собой комбинацию @Controller и @ResponseBody, что по существу означает, что каждый метод в вашем классе будет иметь тело ответа.

2) Префикс @RequestMapping значения в этом классе с / users

3) Autowiring в Constructor является самым безопасным подходом к инъекции bean-компонентов.

4) Этот метод будет доступен через запрос GET для / users / {user_id}

5) Этот метод вернет код состояния HttpStatus.OK при успешном завершении (200)

6) Извлекает переменную пути «user_id» из запроса. Используйте тот же числовой тип, что и ваш идентификатор пользователя (т.е. int или long).

7) Этот метод будет доступен через запрос POST для / users

8) Этот метод будет return HttpStatus.CREATED код состояния при успехе (201)

9) Извлекает UserModel из тела запроса (должен иметь ту же структуру, что и json, указанный ниже).

Нет реальных отличий от Cepr0 и моего подхода, это чисто предпочтение стиля.

UserModel может быть классом следующим образом:

UserModel.java

public class UserModel {

    private String username;

    // Constructor, Getter, Setter...
}

И это вернет объект JSON в тело ответа следующим образом:

{
    "username":"username"
}

Если вы хотите обрабатывать Исключения в своем контроллере (и даже управлять данные, возвращаемые исключением, вы можете использовать @ExceptionHandler следующим образом:

@ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponseWrapper> handleGenericException(Exception ex){
        return ResponseEntity
                .status(HttpStatus.I_AM_A_TEAPOT)
                .body(new CustomExceptionWrapper(ex)));
}

Где CustomExceptionHandler преобразует исключения, созданные вашим приложением, в формат, который вы решите (это также может быть POJO, а Spring Boot преобразует его в JSON для вас!) [/ ​​g17]

Чтобы более точно ответить на ваши вопросы: 1) Вы должны выбросить исключение, если пользователь не будет найден, который будет включать в себя статус ответа 404 (NOT FOUND). Возвращение null - это, как правило, плохая идея, поскольку это может означать много чего.

1.1?) Если ваш пользователь отправляет недопустимую строку, вы можете посмотреть, какое исключение оно вызывает на вашем сервере, и использовать обработчик исключений, чтобы справиться с ним и вернуть соответствующий ответ (возможно, BAD_REQUEST?)

2) Да, используйте long, если ваши идентификаторы использования длинны.

Проверьте сайт baeldung , действительно рекомендуют их для изучения Spring Boot.

2
ответ дан Jordan Mackie 17 August 2018 в 13:10
поделиться
  • 1
    @ExceptionHandler здесь - хороший способ сделать больше, чем обработка по умолчанию Spring, когда запрос ввода недопустим. Например, когда id не является допустимым длинным значением. – dbreaux 13 July 2018 в 13:37
Другие вопросы по тегам:

Похожие вопросы: