专栏首页happyJared让 Restful API 更加 Simpler:Spring Data Rest

让 Restful API 更加 Simpler:Spring Data Rest

背景说明

Spring Data REST 作为 Spring Data 项目的子集,开发者只需使用注解 @RepositoryRestResource 标记,就可以把整个 Repository 转换为 HAL 风格的 REST 资源,目前已支持 Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j等等。

Spring Data REST Introduction

上手示例

下面的示例,可以帮助大家快速了解下使用 Spring Data REST 所带来的便利,当然了,大部分业务场景都不会有这么的简单,因此在实际项目中并不推荐使用:

添加依赖

        <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>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

核心代码

  • 配置 application.yml
spring:
  data:
    rest:
      # Restful API 路径前缀
      base-path: api
      max-page-size: 10
      default-page-size: 5
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&tinyInt1isBit=false
    username: root
    password: root
  mvc:
    servlet:
      load-on-startup: 1
    throw-exception-if-no-handler-found: true
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update
    show-sql: true
    open-in-view: false
  jackson:
    time-zone: GMT+8
logging:
  level:
    web: debug
  • 定义实体和性别枚举类
@Data
@MappedSuperclass
@NoArgsConstructor
@AllArgsConstructor
public class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @UpdateTimestamp
    @Column(nullable = false)
    private Date updateTime;

    @CreationTimestamp
    @Column(nullable = false, updatable = false)
    private Date createTime;

    @Version
    private Long version;

    @NotNull
    private Boolean deleted = false;

}
@Data
@Entity
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class User extends BaseEntity {

    @NotBlank
    private String name;

    @NotNull
    @Enumerated
    private Gender gender;

}
public enum Gender {

    /**
     * 男
     */
    MAN,

    /**
     * 女
     */
    WOMAN,

    /**
     * 未知
     */
    UNKNOWN;

}
  • 添加 Repository
@RepositoryRestResource(path = "user")
public interface UserRepository extends JpaRepository<User, Integer> {

    /**
     * /api/user/search/findByName
     */
    List<User> findByName(@Param("name") String name);

    /**
     * /api/user/1
     */
    @Override
    @Modifying
    @Query("UPDATE User u SET u.deleted = true WHERE u.id = ?1")
    void deleteById(Integer id);

}
  • 初始化测试数据
@SpringBootApplication
public class SpringBootDataRestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDataRestApplication.class, args);
    }

    @Resource
    private UserRepository userRepository;

    /**
     * 初始化数据
     */
    @PostConstruct
    public void init() {
        EnumSet<Gender> genders = EnumSet.allOf(Gender.class);
        List<User> users = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            User user = User.builder().name("test" + i)
                    .gender(genders.stream().findAny().get()).build();
            users.add(user);
        }
        userRepository.saveAll(users);
    }

}

测试说明

启动 Application,此时已暴露出来的 Restful API 接口包含几个:

请求方式

请求路径

接口说明

GET

http://ip:port/api/user{?page,size,sort}

分页查询

GET

http://ip:port/api/user/1

查询id为1的用户

GET

http://ip:port/api/user/search/findByName?name=xxx

查询name为xxx的用户

POST

http://ip:port/api/user

新增用户

PUT

http://ip:port/api/user/1

更新id为1的用户

DELETE

http://ip:port/api/user/1

删除id为1的用户

Test

以上这些动作都有相应的触发事件,我们可以参考文档说明并根据实际需求做补充监听。

参考文档

Spring Data REST Reference Guide

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 获取视频时长及截取帧截图

    只是最近碰到有这方面的项目需求,所以简单 Mark 下本文。下面的示例是参考过他人分享的文章,之后本人再自行实践、调整和测试过的,希望对有这方面需求的人有所帮助...

    happyJared
  • Spring Boot 使用 Druid 连接池

    Spring Boot 1.x 版本中,默认使用的数据库连接池为:Tomcat JDBC;到了 Spring Boot 2.x,也切换到了更高性能的 Hikar...

    happyJared
  • Spring Boot Application 监控管理利器: Spring Boot Admin

    上篇文章了解了 Spring Boot Actuator,引入后即可通过访问不同的端点,来获得相应的监控信息。

    happyJared
  • 【CSS】Houdini, CSS的成人礼

    简单地讲,Paint API就是允许你通过JavaScript注册一个背景函数,类似于linear-gradient()那种,在定义时候可以提供Canvas的2...

    外婆的彭湖湾
  • 最短路问题与标号算法(label correcting algorithm)研究(2) - 最短路径问题简介

    在开始介绍最短路问题之前我们先来简单讨论网络流问题(network flow problems)

    用户1621951
  • 语音识别使用-0730

    位深:每次对声音信号的采样深度,位深可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。

    算法发
  • TreeLSTM Sentiment Classification

    昨天的周日讨论班讲的是TreeLSTM Sentiment Classification,主讲人:王铭涛 今天我来做一下总结。 下面的图片来自于 王铭涛的ppt...

    zenRRan
  • LeetCode 09正则表达式匹配(递归VS动态规划)

    这题刚开始见到,还以为遇到原题了,因为跟剑指offer的其中一题非常像,剑指offer第52题正则表达式,只不过那题给的两个char类型的数组,当时弱弱的用递归...

    bigsai
  • 智能支付稳定性测试实战

    美团支付承载了美团全部的交易流量,按照使用场景可以将其分为线上支付和智能支付两类业务。线上支付,支撑用户线上消费场景,处理美团所有线上交易,为团购、外卖、酒店旅...

    美团技术团队
  • 【DP、双指针】647. Palindromic Substrings

    Given a string, your task is to count how many palindromic substrings in this st...

    echobingo

扫码关注云+社区

领取腾讯云代金券