Статьи

Экспорт репозиториев Spring Data JPA в качестве REST-сервисов с использованием Spring Data REST

Модули Spring Data предоставляют различные модули для унифицированной работы с различными типами источников данных, такими как СУБД, хранилища NOSQL и т. Д. В моей предыдущей статье   SpringMVC4 + Spring Data JPA + настройка SpringSecurity с использованием JavaConfig  я объяснил, как настроить Spring Data JPA с использованием JavaConfig.

Теперь в этом посте давайте посмотрим, как мы можем использовать репозитории Spring Data JPA и экспортировать объекты JPA в качестве конечных точек REST, используя Spring Data REST.

Сначала давайте настроим зависимости spring-data-jpa и spring-data-rest-webmvc в нашем файле pom.xml.

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-webmvc</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>

Убедитесь, что последние выпущенные версии настроены правильно, в противном случае вы столкнетесь со следующей ошибкой:
java.lang.ClassNotFoundException: org.springframework.data.mapping.SimplePropertyHandler

Создать сущности JPA.

@Entity
@Table(name = "USERS")
public class User implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer id;
@Column(name = "username", nullable = false, unique = true, length = 50)
private String userName;
@Column(name = "password", nullable = false, length = 50)
private String password;
@Column(name = "firstname", nullable = false, length = 50)
private String firstName;
@Column(name = "lastname", length = 50)
private String lastName;
@Column(name = "email", nullable = false, unique = true, length = 50)
private String email;
@Temporal(TemporalType.DATE)
private Date dob;
private boolean enabled=true;
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="user_id")
private Set<Role> roles = new HashSet<>();
@OneToMany(mappedBy = "user")
private List<Contact> contacts = new ArrayList<>();
//setters and getters
}
@Entity
@Table(name = "ROLES")
public class Role implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id")
private Integer id;
@Column(name="role_name",nullable=false)
private String roleName;
//setters and getters
}
@Entity
@Table(name = "CONTACTS")
public class Contact implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "contact_id")
private Integer id;
@Column(name = "firstname", nullable = false, length = 50)
private String firstName;
@Column(name = "lastname", length = 50)
private String lastName;
@Column(name = "email", nullable = false, unique = true, length = 50)
private String email;
@Temporal(TemporalType.DATE)
private Date dob;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
//setters and getters
}

Настройте DispatcherServlet с помощью  AbstractAnnotationConfigDispatcherServletInitializer .

Обратите внимание, что мы добавили  RepositoryRestMvcConfiguration.class  в  метод getServletConfigClasses ()  .
RepositoryRestMvcConfiguration  — это тот, который выполняет тяжелую работу по поиску репозиториев данных Spring и их экспорту в качестве конечных точек REST.

package com.sivalabs.springdatarest.web.config;
import javax.servlet.Filter;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import com.sivalabs.springdatarest.config.AppConfig;
public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
protected Class<?>[] getRootConfigClasses()
{
return new Class<?>[] { AppConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses()
{
return new Class<?>[] { WebMvcConfig.class, RepositoryRestMvcConfiguration.class };
}
@Override
protected String[] getServletMappings()
{
return new String[] { "/rest/*" };
}
@Override
    protected Filter[] getServletFilters() {
       return new Filter[]{
       new OpenEntityManagerInViewFilter()
       };
    } 
}

Создание репозиториев Spring Data JPA для объектов JPA.

public interface UserRepository extends JpaRepository<User, Integer>
{
}
public interface RoleRepository extends JpaRepository<Role, Integer>
{
}
public interface ContactRepository extends JpaRepository<Contact, Integer>
{
}

Вот и все. Spring Data REST позаботится обо всем остальном.

Вы можете использовать Spring Rest Shell  https://github.com/spring-projects/rest-shell  или Chrome Postman Addon для тестирования экспортированных REST-сервисов.

D:\rest-shell-1.2.1.RELEASE\bin>rest-shell
http://localhost:8080:>

Now we can change the baseUri using baseUri command as follows:
http://localhost:8080:>baseUri http://localhost:8080/spring-data-rest-demo/rest/
http://localhost:8080/spring-data-rest-demo/rest/>


http://localhost:8080/spring-data-rest-demo/rest/>list
rel         href
======================================================================================
users       http://localhost:8080/spring-data-rest-demo/rest/users{?page,size,sort}
roles       http://localhost:8080/spring-data-rest-demo/rest/roles{?page,size,sort}
contacts    http://localhost:8080/spring-data-rest-demo/rest/contacts{?page,size,sort}

Примечание. Кажется, существует проблема с rest-shell, когда URL-адрес DispatcherServlet сопоставлен с «/», и на команду list list он отвечает «Ресурсы не найдены».

http: // localhost: 8080 / spring-data-rest-demo / rest / > получить пользователей /

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/spring-data-rest-demo/rest/users/{?page,size,sort}",
            "templated": true
        },
        "search": {
            "href": "http://localhost:8080/spring-data-rest-demo/rest/users/search"
        }
    },
    "_embedded": {
        "users": [
            {
                "userName": "admin",
                "password": "admin",
                "firstName": "Administrator",
                "lastName": null,
                "email": "admin@gmail.com",
                "dob": null,
                "enabled": true,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/spring-data-rest-demo/rest/users/1"
                    },
                    "roles": {
                        "href": "http://localhost:8080/spring-data-rest-demo/rest/users/1/roles"
                    },
                    "contacts": {
                        "href": "http://localhost:8080/spring-data-rest-demo/rest/users/1/contacts"
                    }
                }
            },
            {
                "userName": "siva",
                "password": "siva",
                "firstName": "Siva",
                "lastName": null,
                "email": "sivaprasadreddy.k@gmail.com",
                "dob": null,
                "enabled": true,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/spring-data-rest-demo/rest/users/2"
                    },
                    "roles": {
                        "href": "http://localhost:8080/spring-data-rest-demo/rest/users/2/roles"
                    },
                    "contacts": {
                        "href": "http://localhost:8080/spring-data-rest-demo/rest/users/2/contacts"
                    }
                }
            }
        ]
    },
    "page": {
        "size": 20,
        "totalElements": 2,
        "totalPages": 1,
        "number": 0
    }
}

Вы можете найти исходный код по адресу 
https://github.com/sivaprasadreddy/sivalabs-blog-samples-code/tree/master/spring-data-rest-demo

Для получения дополнительной информации о Spring Rest Shell: 
https: // github. ком / весна-проекты / отдых-оболочка