Spring Boot 2 + Jersey REST + JPA + Hibernate 5 CRUD REST APIs 示例

x33g5p2x  于2022-10-06 转载在 Spring  
字(11.1k)|赞(0)|评价(0)|浏览(618)

在这篇文章中,我们将逐步学习如何使用Jersey 2.26Spring boot 2.0.5 RELEASEJPA/Hibernate 5MySQL作为数据库的集成来开发CRUD REST APIs。
Jersey RESTful Web服务框架是开源的、具有生产质量的、在Java中开发RESTful Web服务的框架,它提供对JAX-RS API的支持,并作为JAX-RS(JSR 311 & JSR 339)参考实现。

Spring boot使用spring-boot-starter-jersey启动依赖,为Jersey与spring boot应用程序的集成提供了支持。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jersey</artifactId>
  4. </dependency>

让我们一步一步地创建一个Spring Boot Jersey CRUD RESTful APIs项目。

1. 我们要建立什么?

我们正在开发一个CRUD REST APIs,使用Jersey 2.26Spring boot 2.0.5 RELEASE、JPA/Hibernate 5和MySQL作为数据库的整合。

2. 使用的工具和技术

  • Spring Boot - 2.0.4.RELEASE
  • JDK - 1.8或更高版本
  • Spring Framework - 5.0.8 RELEASE
  • Hibernate - 5.2.17.Final
  • Maven - 3.2以上
  • Spring Data JPA - 2.0.10 RELEASE
  • IDE - Eclipse或Spring Tool Suite (STS)
  • mysql - 5.1.47
  • Jersey - 2.26

3. 创建和导入一个项目

有很多方法可以创建Spring Boot应用程序。最简单的方法是在http://start.spring.io/使用Spring Initializr,它是一个在线Spring Boot应用程序生成器。

看上面的图,我们指定了以下细节。

  • Generate:Maven项目
  • Java版本:1.8(默认)。
  • Spring Boot:2.0.6
  • Group:net.guards.springboot2
  • Artifact: springboot-jersey-rest-crud-jpa
  • Name: springboot-jersey-rest-crud-jpa
  • Description: 简单用户管理应用的Rest API
  • Package Name:net.guards.springboot2
  • Packaging: jar (这是默认值)
  • Dependencies:Jersey, JPA, MySQL
    一旦,所有的细节被输入,点击生成项目按钮将生成一个spring boot项目并下载。接下来,解压下载的压缩文件并将其导入你最喜欢的IDE。

4. 包装结构

以下是供你参考的打包结构 -

the pom.xml File

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>net.guides.springboot2</groupId>
  7. <artifactId>springboot-jersey-rest-crud-jpa</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <name>springboot-jersey-rest-crud-jpa</name>
  11. <description>Demo project for Spring Boot</description>
  12. <parent>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-parent</artifactId>
  15. <version>2.0.5.RELEASE</version>
  16. <relativePath /> <!-- lookup parent from repository -->
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  21. <java.version>1.8</java.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-data-jpa</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-jersey</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>mysql</groupId>
  39. <artifactId>mysql-connector-java</artifactId>
  40. <scope>runtime</scope>
  41. </dependency>
  42. </dependencies>
  43. <build>
  44. <plugins>
  45. <plugin>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-maven-plugin</artifactId>
  48. </plugin>
  49. </plugins>
  50. </build>
  51. </project>

SpringBootCrudRestApplication.java

这个spring boot应用程序有一个名为SpringBootCrudRestApplication.java的入口点Java类,其中有*public static void main(String[] args)*方法,你可以运行它来启动应用程序。

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class SpringBootCrudRestApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(SpringBootCrudRestApplication.class, args);
  7. }
  8. }

@SpringBootApplication是一个方便的注解,增加了以下所有内容。

  • @Configuration将该类标记为应用程序上下文的bean定义的来源。
  • @EnableAutoConfiguration告诉Spring Boot开始根据classpath设置、其他bean和各种属性设置来添加bean。
  • 通常你会为Spring MVC应用添加@EnableWebMvc,但Spring Boot在classpath上看到spring-webmvc时,会自动添加它。这标志着该应用是一个Web应用,并激活了一些关键行为,如设置DispatcherServlet。
  • @ComponentScan告诉Spring寻找hello包中的其他组件、配置和服务,使其能够找到控制器。
    main()方法使用Spring Boot的SpringApplication.run()方法来启动一个应用程序。

5. 配置MySQL数据库

配置application.properties以连接到你的MySQL数据库。让我们打开一个application.properties文件,并在其中添加以下数据库配置。

  1. spring.datasource.url = jdbc:mysql://localhost:3306/users_database?useSSL=false
  2. spring.datasource.username = root
  3. spring.datasource.password = root
  4. ## Hibernate Properties
  5. # The SQL dialect makes Hibernate generate better SQL for the chosen database
  6. spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
  7. # Hibernate ddl auto (create, create-drop, validate, update)
  8. spring.jpa.hibernate.ddl-auto = update

根据你的环境改变上述配置,如JDBC URL、用户名和密码。

6. 创建泽西岛资源 - UserResource.java

  1. package net.guides.springboot2.springbootjerseyrestcrudjpa.controller;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.validation.Valid;
  6. import javax.ws.rs.Consumes;
  7. import javax.ws.rs.DELETE;
  8. import javax.ws.rs.GET;
  9. import javax.ws.rs.POST;
  10. import javax.ws.rs.PUT;
  11. import javax.ws.rs.Path;
  12. import javax.ws.rs.PathParam;
  13. import javax.ws.rs.Produces;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.http.ResponseEntity;
  16. import org.springframework.stereotype.Component;
  17. import org.springframework.web.bind.annotation.PostMapping;
  18. import org.springframework.web.bind.annotation.RequestBody;
  19. import net.guides.springboot2.springbootjerseyrestcrudjpa.exception.ResourceNotFoundException;
  20. import net.guides.springboot2.springbootjerseyrestcrudjpa.model.User;
  21. import net.guides.springboot2.springbootjerseyrestcrudjpa.repository.UserRepository;
  22. @Component
  23. @Path("/api/v1")
  24. public class UserResource {
  25. @Autowired
  26. private UserRepository userRepository;
  27. @GET
  28. @Produces("application/json")
  29. @Path("/users")
  30. public List<User> getAllUsers() {
  31. return userRepository.findAll();
  32. }
  33. @GET
  34. @Produces("application/json")
  35. @Path("/users/{id}")
  36. public ResponseEntity<User> getUserById(@PathParam(value = "id") Long userId) throws ResourceNotFoundException {
  37. User user = userRepository.findById(userId)
  38. .orElseThrow(() -> new ResourceNotFoundException("User not found :: " + userId));
  39. return ResponseEntity.ok().body(user);
  40. }
  41. @POST
  42. @Produces("application/json")
  43. @Consumes("application/json")
  44. @Path("/users")
  45. @PostMapping("/users")
  46. public User createUser(User user) {
  47. return userRepository.save(user);
  48. }
  49. @PUT
  50. @Consumes("application/json")
  51. @Path("/users/{id}}")
  52. public ResponseEntity<User> updateUser(@PathParam(value = "id") Long userId,
  53. @Valid @RequestBody User userDetails) throws ResourceNotFoundException {
  54. User user = userRepository.findById(userId)
  55. .orElseThrow(() -> new ResourceNotFoundException("User not found :: " + userId));
  56. user.setEmailId(userDetails.getEmailId());
  57. user.setLastName(userDetails.getLastName());
  58. user.setFirstName(userDetails.getFirstName());
  59. final User updatedUser = userRepository.save(user);
  60. return ResponseEntity.ok(updatedUser);
  61. }
  62. @DELETE
  63. @Path("/users/{id}")
  64. public Map<String, Boolean> deleteUser(@PathParam(value = "id") Long userId) throws ResourceNotFoundException {
  65. User user = userRepository.findById(userId)
  66. .orElseThrow(() -> new ResourceNotFoundException("User not found :: " + userId));
  67. userRepository.delete(user);
  68. Map<String, Boolean> response = new HashMap<>();
  69. response.put("deleted", Boolean.TRUE);
  70. return response;
  71. }
  72. }

我们已经创建了一个UserResource类,并使用了JAX-RS注解。
@Path用于识别资源类或类方法将为请求服务的URI路径(相对)。

@PathParam用于将URI模板参数的值或包含模板参数的路径段与资源方法参数、资源类字段或资源类豆类属性绑定。除非使用@Encoded注解禁用,否则该值会被URL解码。
@GET表示注解的方法处理HTTP GET请求。

@POST表示该注解方法处理HTTP POST请求。
@PUT表示该注解方法处理HTTP PUT请求。

@DELETE表示被注解的方法处理HTTP DELETE请求。
@Produces 定义了资源方法可以产生的媒体类型。

@Consumes 定义了该资源方法可以接受的媒体类型。
你可以在JAX-RS教程中找到所有的JAX-RS注解。

你可能已经注意到,我们用 @Component 注解了 UserResource,这是 Spring 的注解,并将其注册为一个 Bean。我们这样做是为了让Spring的DI能够注入UserRepository类。
当使用Jersey创建REST API时,资源的命名标准应该是实体名称的后缀为 "资源 "字符串,例如UserResource, EmployeeResource

7. 创建一个JerseyConfiguration类

我们创建了一个JerseyConfiguration类,它扩展了包org.glassfish.jersey.server中的ResourceConfig,用来配置网络应用。我们使用resister方法注册了UserResource@ApplicationPath标识了作为所有资源基础URI的应用路径。

  1. package net.guides.springboot2.springbootjerseyrestcrudjpa.config;
  2. import javax.ws.rs.ApplicationPath;
  3. import org.glassfish.jersey.server.ResourceConfig;
  4. import org.springframework.stereotype.Component;
  5. import net.guides.springboot2.springbootjerseyrestcrudjpa.controller.UserResource;
  6. @Component
  7. @ApplicationPath("/boot-jersey")
  8. public class JerseyConfiguration extends ResourceConfig {
  9. public JerseyConfiguration() {
  10. register(UserResource.class);
  11. }
  12. }

8. 创建一个名为User.java的JPA实体。

  1. package net.guides.springboot2.springbootjerseyrestcrudjpa.model;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.GenerationType;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;
  8. @Entity
  9. @Table(name = "table_users")
  10. public class User {
  11. @Id
  12. @GeneratedValue(strategy = GenerationType.AUTO)
  13. private long id;
  14. @Column(name = "first_name", nullable = false)
  15. private String firstName;
  16. @Column(name = "last_name", nullable = false)
  17. private String lastName;
  18. @Column(name = "email_address", nullable = false)
  19. private String emailId;
  20. public long getId() {
  21. return id;
  22. }
  23. public void setId(long id) {
  24. this.id = id;
  25. }
  26. public String getFirstName() {
  27. return firstName;
  28. }
  29. public void setFirstName(String firstName) {
  30. this.firstName = firstName;
  31. }
  32. public String getLastName() {
  33. return lastName;
  34. }
  35. public void setLastName(String lastName) {
  36. this.lastName = lastName;
  37. }
  38. public String getEmailId() {
  39. return emailId;
  40. }
  41. public void setEmailId(String emailId) {
  42. this.emailId = emailId;
  43. }
  44. }

实现审计请参考Spring Data JPA Auditing with Spring Boot 2 and MySQL Example您可以使用Spring Boot 2 Logging SLF4j Logback和LOG4j2实例实现日志记录您可以使用Spring Boot 2 Exception Handling for REST APIs实现异常处理您可以使用Spring Boot CRUD REST APIs验证实例实现自定义bean验证

9. 创建Spring Data JPA存储库 - UserRepository.java

  1. package net.guides.springboot2.springbootjerseyrestcrudjpa.repository;
  2. import org.springframework.data.jpa.repository.JpaRepository;
  3. import org.springframework.stereotype.Repository;
  4. import net.guides.springboot2.springbootjerseyrestcrudjpa.model.User;
  5. @Repository
  6. public interface UserRepository extends JpaRepository<User, Long>{
  7. }

10. 创建ResourceNotFoundException.java类

  1. package net.guides.springboot2.springbootjerseyrestcrudjpa.exception;
  2. import org.springframework.http.HttpStatus;
  3. import org.springframework.web.bind.annotation.ResponseStatus;
  4. @ResponseStatus(value = HttpStatus.NOT_FOUND)
  5. public class ResourceNotFoundException extends Exception{
  6. private static final long serialVersionUID = 1L;
  7. public ResourceNotFoundException(String message){
  8. super(message);
  9. }
  10. }

11. 运行应用程序

我们已经成功地为User模型开发了所有的CRUD Rest API。现在是时候将我们的应用程序部署到servlet容器(嵌入式tomcat)中了。我们可以通过两种方式启动独立的Spring boot应用程序。

  1. 在应用程序的根目录下,键入以下命令来运行它-- 1.
  1. $ mvn spring-boot:run
  1. 从你的IDE中,将SpringbootJerseyRestCrudJpaApplication.main()方法作为一个独立的Java类运行,它将在8080端口启动嵌入式Tomcat服务器,并将浏览器指向http://localhost:8080/

12. 通过Postman客户端测试

  1. 创建用户REST API

  1. 通过ID获取用户 REST API

  1. 获取所有用户的REST API

  1. 更新用户REST API

  1. 删除用户 REST API

相关文章