Модули 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": "[email protected]", "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": "[email protected]", "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. ком / весна-проекты / отдых-оболочка