背景說明
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