1. введение
Spring Data REST может удалить много шаблонов, которые естественны для служб REST.
В этом уроке мы рассмотрим, как настроить некоторые из HTTP-привязок Spring Data REST по умолчанию .
2. Основы репозитория Spring Data REST
Для начала давайте создадим пустой интерфейс, который расширяет CrudRepository интерфейс , указав тип нашей сущности и тип ее первичного ключа:
public interface UserRepository extends CrudRepository{}
По умолчанию Spring генерирует все необходимые сопоставления , настраивает доступ к каждому ресурсу с помощью соответствующих методов HTTP и возвращает соответствующие коды состояния.
Если нам не нужны все ресурсы , определенные в CrudRepository , мы можем расширить базовый Репозиторий интерфейс и определить только те ресурсы, которые нам нужны :
public interface UserRepository extends Repository{ void deleteById(Long aLong); }
При получении запроса Spring считывает используемый метод HTTP и, в зависимости от типа ресурса, вызывает соответствующий метод, определенный в нашем интерфейсе , если он присутствует, или возвращает статус HTTP 405 (Метод не разрешен) в противном случае.
Со ссылкой на приведенный выше код, когда Spring получает запрос на УДАЛЕНИЕ, он выполняет наш метод deleteById .
3. Ограничение Доступа К Методам HTTP
Давайте представим, что у нас есть система управления пользователями. Тогда у нас может быть UserRepository.
И, поскольку мы используем Spring Data REST, мы получаем много от его расширения CrudRepository :
@RepositoryRestResource(collectionResourceRel = "users", path = "users") public interface UserRepository extends CrudRepository{}
Все наши ресурсы доступны с использованием шаблона CRUD по умолчанию , поэтому выполните следующую команду:
curl -v -X DELETE http://localhost:8080/users/
вернет статус HTTP 204 (Содержимое не возвращено) для подтверждения удаления.
Теперь предположим, что мы хотим скрыть удалить метод от третьих лиц, имея возможность использовать его внутри.
Затем мы можем сначала добавить сигнатуру метода deleteById в наш интерфейс, который сигнализирует остальным данным, что мы собираемся его настроить.
Затем мы можем использовать аннотацию @RestResource(exported) , которая настроит Spring на пропуск этого метода при запуске HTTP-метода. :
@Override @RestResource(exported = false) void deleteById(Long aLong);
Теперь, если мы повторим ту же команду cUrl , показанную выше, вместо этого мы получим HTTP-статус 405 (Метод не разрешен) .
4. Настройка поддерживаемых методов HTTP
Аннотация @RestResource также дает нам возможность настроить путь URL, сопоставленный с методом репозитория , и идентификатор ссылки в JSON, возвращаемый HATEOAS resource discovery.
Для этого мы используем необязательные параметры аннотации:
- путь для пути URL-адреса
- rel для идентификатора ссылки
Давайте вернемся к нашему UserRepository и добавим простой findByEmail метод:
WebsiteUser findByEmail(@Param("email") String email);
Выполнив cUrl to http://localhost:8080/users/search/ , теперь мы можем видеть наш новый метод в списке других ресурсов:
{ "_links": { "findByEmail": { "href": "http://localhost:8080/users/search/findByEmail{?email}" }, "self": { "href": "http://localhost:8080/users/search/" } } }
Если нам не нравится путь по умолчанию, вместо изменения метода репозитория мы можем просто добавить @RestResource аннотацию :
@RestResource(path = "byEmail", rel = "customFindMethod") WebsiteUser findByEmail(@Param("email") String email);
И если мы снова проведем обнаружение ресурсов, полученный JSON подтвердит наши изменения:
{ "_links": { "customFindMethod": { "href": "http://localhost:8080/users/search/byEmail{?email}", "templated": true }, "self": { "href": "http://localhost:8080/users/search/" } } }
5. Программная конфигурация
Иногда нам нужен более тонкий уровень конфигурации, чтобы предоставить или ограничить доступ к нашим методам HTTP. Например, ПУБЛИКАЦИЯ на ресурсах сбора, а также РАЗМЕЩЕНИЕ и ИСПРАВЛЕНИЕ на ресурсах элементов используют один и тот же метод save .
Начиная с Spring Data REST 3.1 и доступной с Spring Boot 2.1 , мы можем изменить экспозицию конкретного метода HTTP через класс ExposureConfiguration . Этот конкретный класс конфигурации предоставляет API на основе лямбды для определения как глобальных, так и основанных на типах правил.
Например, мы можем использовать Конфигурацию экспозиции для ограничения запросов на ИСПРАВЛЕНИЕ в отношении UserRepository :
public class RestConfig implements RepositoryRestConfigurer { @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration restConfig) { ExposureConfiguration config = restConfig.getExposureConfiguration(); config.forDomainType(WebsiteUser.class).withItemExposure((metadata, httpMethods) -> httpMethods.disable(HttpMethod.PATCH)); } }
6. Заключение
В этой статье мы рассмотрели, как настроить Spring Data REST для настройки методов HTTP, поддерживаемых по умолчанию в наших ресурсах.
Как обычно, примеры, используемые в этой статье, можно найти в нашем проекте GitHub .