Статьи Утилиты Telegram YouTube VK Видео RuTube Отзывы

Обновление записи через PUT-запрос в Spring Boot

Исходники

9 марта 2026

Тэги: Java, json, rest, Spring Boot, SQL, руководство.

Содержание

  1. Репозиторий
  2. Сервисный слой
  3. Контроллер

В предыдущей статье Добавление записи через POST-запрос в Spring Boot мы научились создавать новые записи в БД. Теперь попробуем создать полноценный rest-интерфейс для обновления ранее добавленных записей. Исходники проекта вы можете посмотреть на github.

За основу возьмём наше приложение из указанной статьи. Оно состоит из трёх слоёв:

  • репозиторий (repository) - работа с БД
  • бизнес-логика приложения (service)
  • rest-интерфейс (controller), который обрабатывает входящий json и генерирует исходящий.

Репозиторий

Начнём с доработки репозитория (класс ProfileRepository), в который мы добавим sql-запрос в виде константы. Такие константы принято размещать в начале класса:

    private static final String SQL_UPDATE_PROFILE =
        "update profile set first_name = :firstName, last_name = :lastName, age = :age where id = :id";

Для обновления нам потребуется указать id записи, а также остальные значимые поля.

Вот реализация обновления записи в БД:

public void updateProfile(String firstName, String lastName, int age, int id) {
    jdbcClient.sql(SQL_UPDATE_PROFILE)
            .param("firstName", firstName)
            .param("lastName", lastName)
            .param("age", age)
            .param("id", id)
            .update();
}

В jdbcClient сначала передаём sql-запрос, затем с помощью методов param() указываем необходимые параметры и в конце вызываем метод update(), который отвечает за любые изменения данных.

Сервисный слой

Перейдём к сервисному слою. В интерфейс ProfileService добавим новый метод:

void updateProfile(String firstName, String secondName, int age, int id);

Его реализация в ProfileServiceImpl:

@Override
public void updateProfile(String firstName, String secondName, int age, int id) {
    log.info("Update profile by id={}", id);
    var profile = profileRepository.getProfileById(id)
            .orElseThrow(() -> new ProfileNotFoundException(id));
    profileRepository.updateProfile(firstName, secondName, age, profile.id());
}

Здесь операцию нужно выполнить над уже существующей записью, поэтому перед вызовом надо проверить её наличие в БД. Если по каким-то причинам её там не нашлось - сразу кидаем исключение, которое будет преобразовано в соответствующий json благодаря ErrorController, который мы рассматривали ранее.

Контроллер

Согласно архитектуре restful-сервисов, чтение данных мы делаем при помощи GET-запросов, а изменение - при помощи PUT. У GET-запроса не может быть тела запроса (body), все его параметры перечисляются в строке запроса. А PUT-запрос может иметь тело, в которое мы будем помещать целевой json.

Перейдём к нашему контроллеру ProfileController и добавим в него метод обновления профиля.

@PutMapping(value = "/{personId:\\d+}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void updateProfile(
        @Valid @RequestBody ProfileRequest request,
        @PathVariable int personId
) {
    profileService.updateProfile(
            request.firstName(),
            request.lastName(),
            request.age(),
            personId
    );
}

В качестве аргумента метод принимает модель запроса ProfileRequest, который мы рассматривали в предыдущей статье.

Аннотация @PutMapping говорит, что это - обработчик PUT-запроса, причём в адресной строке также требуется указать personId (после двоеточия указана регулярка, т.е. мы ожидаем любое количество цифр). Значение этого параметра будет помещено в соответствующую переменную благодаря @PathVariable. В ответ метод будет возвращать http-статус 204 - «No Content».

Теперь мы готовы к тому, чтобы выполнить rest-запрос на обновление новой записи в БД. Запускаем приложение и отравляем указанный PUT-запрос по адресу http://127.0.0.1:8080/profiles/1, где 1 - это номер существующей записи. В http-заголовках обязательно указываем Content-Type: application/json.

{
  "firstName": "Петр",
  "lastName": "Сидоров",
  "age": 14
}

В ответ в случае успеха получаем http-статус 204. А если укажем id записи, которой нет в БД, то получим следующий ответ:

{
  "message": "Profile with id = 123 not found"
}

Таким образом, Spring Boot позволяет буквально за 5 минут создать полноценный обработчик PUT-запроса с валидацией входящих параметров.

В следующей статье Удаление записи через DELETE-запрос в Spring Boot мы научимся удалять существующие записи из БД.


См. также

Облако тэгов

Kotlin, Java, Spring, Spring Boot, Spring Data, Spring AI, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи


Комментарии

Добавить комментарий

×

devmark.ru