讓 Restful API 更加 Simpler:Spring Data Rest

背景說明

Spring Data REST 作為 Spring Data 項目的子集,開發(fā)者只需使用注解 @RepositoryRestResource 標(biāo)記,就可以把整個 Repository 轉(zhuǎn)換為 HAL 風(fēng)格的 REST 資源,目前已支持 Spring Data JPA、Spring Data MongoDB、Spring Data Neo4j等等。

上手示例

下面的示例,可以幫助大家快速了解下使用 Spring Data REST 所帶來的便利,當(dāng)然了,大部分業(yè)務(wù)場景都不會有這么的簡單,因此在實際項目中并不推薦使用:

添加依賴

        <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);

}

  • 初始化測試數(shù)據(jù)
@SpringBootApplication
public class SpringBootDataRestApplication {

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

    @Resource
    private UserRepository userRepository;

    /**
     * 初始化數(shù)據(jù)
     */
    @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的用戶

以上這些動作都有相應(yīng)的觸發(fā)事件,我們可以參考文檔說明并根據(jù)實際需求做補充監(jiān)聽。

參考文檔

Spring Data REST Reference Guide

示例源碼

文章已授權(quán)轉(zhuǎn)載,原文鏈接:讓 Restful API 更加 Simpler:Spring Data Rest

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容