Упростите разработку RESTful, Spring Data REST уменьшает выпадение волос

Spring Boot

1. Введение

Добро пожаловать в гостиТыквенный медленный разговор www.pkslow.comПолучайте больше отличных статей!

Springboot + Spring MVCсильно упрощенныйWebПрименяемыйRESTfulразвитие, при этомSpring Data RESTпроще.Spring Data RESTУстановленоData Repositoryвыше, он может прямо поставитьresositoryкHATEOASстиль выставленWebобслуживание без рукописного вводаControllerЭтаж.

HATEOAS,СейчасHypermedia as the Engine of Application State, это более взрослоеRESTМодель содержит информацию о ссылке в представлении ресурса, и клиент может обнаружить исполняемые действия по ссылке.

Spring Data RESTслужба поддержкиSpring Data JPA,Spring Data MongoDB,Spring Data Neo4j,Spring Data GenFire,Spring Data Cassandra, здесь выберите тот, который вам больше знакомJPA.

2 Приведите пример

Давайте прочувствуем это на примере.

2.1 Создать проект

мы проходимSpring Initializrбыстро создатьSpringbootпроект. Выбраны следующие зависимые компоненты:

  • (1)Spring Web:поставкаWebСлужить;
  • (2)Rest Repositories:поставкаSpring Data RESTслужба поддержки;
  • (3)Spring Data JPA:пройти черезJPAпоставкаRepositoryсредства доступа к данным;
  • (4)H2 Database:H2База данных, которая используется для удобства и краткости.

После импорта соответствующегоpom.xmlЗависимости следующие:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>runtime</scope>
</dependency>

2.2 Класс сущности

Создайте класс сущностейUser,Следующее:

package com.pkslow.rest.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private Integer age;
    private String email;
  
  //getter & setter
}

2.3 Определение интерфейса репозитория

определениеRepositoryИнтерфейс используется для управления базой данных следующим образом:

package com.pkslow.rest.repo;

import com.pkslow.rest.entity.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(path = "user")
public interface UserRepository extends CrudRepository<User, Integer> {
}

аннотацияRepositoryRestResourceдаData RESTдля экспозицииRepository,pathпуть доступа, установленный вuser, адрес доступаhttp://localhost:8080/user.

2.4 Инициировать доступ

Подготовьте приведенный выше код и начните напрямуюSpringbootПриложение может быть, мы устанавливаем порт на8080, доступ к которому осуществляется следующим образом:

мы используемPostmanВыполните базовую операцию.

Добавлен:

Спросите:

по первичному ключуIDСпросите:

Исправлять:

Удалить:

Не трудно найти, возвращениеJsonВсе со ссылками, этоHATEOASстиль.

3 Еще для изучения

3.1 Функции пейджинга и сортировки

Вы можете быстро реализовать функции разбиения на страницы и сортировки, просто поставивRepositoryРодительский интерфейс изменен наPagingAndSortingRepositoryВот так, следующим образом:

@RepositoryRestResource(path = "user")
public interface UserRepository extends PagingAndSortingRepository<User, Integer> {
}

На самом деле есть еще два методаfindAll(Sort var1)а такжеfindAll(Pageable var1),Следующее:

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
    Iterable<T> findAll(Sort var1);

    Page<T> findAll(Pageable var1);
}

Запросhttp://localhost:8080/user?page=1&size=2&sort=id,desc, что означает запрашивать вторую страницу, 2 записи на страницу, сIDОтображение в обратном порядке. следующее:

{
  "_embedded": {
    "users": [
      {
        "name": "pkslow.com",
        "age": 18,
        "email": "pkslow@pkslow.com",
        "_links": {
          "self": {
            "href": "http://localhost:8080/user/33"
          },
          "user": {
            "href": "http://localhost:8080/user/33"
          }
        }
      },
      {
        "name": "pkslow.com",
        "age": 18,
        "email": "pkslow@pkslow.com",
        "_links": {
          "self": {
            "href": "http://localhost:8080/user/32"
          },
          "user": {
            "href": "http://localhost:8080/user/32"
          }
        }
      }
    ]
  },
  "_links": {
    "first": {
      "href": "http://localhost:8080/user?page=0&size=2&sort=id,desc"
    },
    "prev": {
      "href": "http://localhost:8080/user?page=0&size=2&sort=id,desc"
    },
    "self": {
      "href": "http://localhost:8080/user?page=1&size=2&sort=id,desc"
    },
    "next": {
      "href": "http://localhost:8080/user?page=2&size=2&sort=id,desc"
    },
    "last": {
      "href": "http://localhost:8080/user?page=17&size=2&sort=id,desc"
    },
    "profile": {
      "href": "http://localhost:8080/profile/user"
    }
  },
  "page": {
    "size": 2,
    "totalElements": 35,
    "totalPages": 18,
    "number": 1
  }
}

Его можно найтиpageОт0начал,1Указывает вторую страницу; возвращаемый результат также содержит ссылки на первую страницу, предыдущую страницу, эту страницу, следующую страницу и последнюю страницу, а также информацию о разбиении на страницы.

3.2 Мониторинг событий

RESTОбеспечивает 8 на основеRepositoryсобытия следующим образом:

  • BeforeCreateEvent
  • AfterCreateEvent
  • BeforeSaveEvent
  • AfterSaveEvent
  • BeforeLinkSaveEvent
  • AfterLinkSaveEvent
  • BeforeDeleteEvent
  • AfterDeleteEvent

Добавьте пользовательское событие следующим образом:

package com.pkslow.rest.event;

import com.pkslow.rest.entity.User;
import org.springframework.data.rest.core.event.AbstractRepositoryEventListener;
import org.springframework.stereotype.Component;

@Component
public class PkslowEventListener extends AbstractRepositoryEventListener<User> {

    @Override
    public void onBeforeCreate(User entity) {
        System.out.println("pkslow creating:" + entity);
    }

    @Override
    public void onBeforeSave(User entity) {
        System.out.println("pkslow saving:" + entity);
    }

    @Override
    public void onAfterDelete(User entity) {
        System.out.println("pkslow deleted:" + entity);
    }
}

После добавления, изменения и удаления соответственно журнал выглядит следующим образом:

pkslow creating:User{id=null, name='pkslow.com', age=18, email='pkslow@pkslow.com'}
pkslow saving:User{id=32, name='pkslow.com', age=20, email='pkslow@pkslow.com'}
pkslow deleted:User{id=14, name='pkslow.com', age=18, email='pkslow@pkslow.com'}

Это указывает на то, что событие было успешно выполнено.В сочетании с этой функцией можно реализовать много бизнес-логики, например, запись журнала операций после удаления и удаление других связанных данных.

3.3 Путь

Базовый путь по умолчанию/, в состоянии пройтиspring.data.rest.base-path=apiнастройте его так, чтобы он сталlocalhost:8080/api/user.

4 Интегрированный вид браузера HAL

HAL Browserэто специальный браузерныйJSON Hypertext Application Languageфронтальные инструменты. Мы уже предоставилиHATEOASСтильRESTfulСлужить,HAL Browserможно легко просмотреть.

Добавьте зависимости:

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-rest-hal-browser</artifactId>
  <version>3.3.2.RELEASE</version>
</dependency>

доступ после запускаhttp://localhost:8080/browser/index.html#/следующее:

можно продолжитьCRUDОперация не показана подробно по одной.

5 Резюме

В этой статье описываетсяSpring Data REST, удобно всемRESTfulразвитие сервиса. Но понятно, что он мало используется в проекте, просто выучить это своего рода понимание.SpringПуть всей семьи ведра и идеи архитектуры.

Подробный код этой статьи можно найти наТыква медленный разговорОтвет публичного аккаунтаSpringDataRest> Получить.


Добро пожаловать в публичный аккаунт WeChatТыква медленный разговор>, буду обновлять для вас...

Читайте больше, делитесь больше, пишите больше, организуйте больше.