javascript
具有中央异常处理和VO验证的Spring Data JPA –框架
1.簡介
一段時間以來,Spring框架已成為事實上的標準,可以創建任何基于REST API的應用程序。 Spring提供了各種現成的組件,以避免編寫重復而繁瑣的樣板代碼。 另外,關于Spring的美麗之處在于,如果有現成的解決方案,它就可以解決。 它為您提供了與現有庫/框架集成的簡便方法。 在本文中,讓我們看看如何使用全棧Spring技術編寫基于Spring的RESTful API。 Spring Boot,Spring Validations和Spring數據JPA的示例顯示了以下方面的完整信息:
- Spring Boot及其配置
- 使用Spring Boot Starters進行依賴管理
- 使用Spring數據JPA避免瓶頸DAO代碼。
- Spring支持VO級別的驗證。
- 集中式異常處理。
我們使用Gradle進行依賴管理并作為構建工具。 讓我們逐步進行。
2.生成項目
這是生成項目所需遵循的步驟。
2.1 Spring Intializer
Spring在此位置Spring INITIALIZR提供了易于啟動的項目生成工具。 在此網頁上,您可以通過添加所需的依賴項來引導應用程序。 您可以通過添加下面提到的3個依賴項來生成項目框架(請參見下圖以清楚了解)。
1.'Web':此依賴關系是編碼Web層和創建API所必需的。 生成項目后,它在build.gralde文件中顯示為以下依賴項。
compile('org.springframework.boot:spring-boot-starter-web') 2.'Validation':啟用彈簧驗證。 它在build.gradle中顯示為以下依賴項。 compile('org.springframework.boot:spring-boot-starter-validation') 3.'JPA':啟用彈簧數據JPA。 它在build.gradle中顯示為以下依賴項。 compile('org.springframework.boot:spring-boot-starter-data-jpa')
彈簧初始化器
2.2 Eclipse配置
生成項目并將其導入到Eclipse中。 完成此操作后,就可以創建API。 在eclipse中導入的項目應如下所示。
項目結構
3.創建API
在編寫API之前,讓我們根據Java約定創建包,如下所示。
Java包
使用生成的代碼,我們在根包中獲得一個類,即com.example.spring.springrestapp。 這是我們的啟動類。
入門班
注意:應該使用默認配置在根軟件包級別創建啟動類。
現在,讓我們繼續創建控制器類和API方法,以向數據庫添加用戶詳細信息。 對于我們將要構建的該API,讓我們假設一些約束作為我們的要求:
- 該API應該收集用戶的名字,姓氏,電子郵件,地址和電話號碼并將其存儲在MySQL DB中
- API調用者將姓,名和電子郵件作為必填字段傳遞。 電子郵件應經過格式驗證。
- 家庭住址和電話號碼可以是可選的。
4.配置數據庫詳細信息:
對于此項目,您需要運行MySQL DB的本地實例。 您可以在application.properties中提供數據庫詳細信息,如下所示。
應用特性
spring.datasource.url = jdbc:mysql://localhost:3306/boot_app spring.datasource.username = root spring.datasource.password = root在MySQL DB中,使用以下腳本在MySQL DB中創建一個包含名字,姓氏,電子郵件,地址和電話號碼的表。
創建表腳本
create table user_info( user_id smallint(10) primary key auto_increment, first_name varchar(150), last_name varchar(150), email varchar(200), address varchar(250), phone smallint(10) );5.配置Spring Data JPA
表準備好后,我們需要使用JPA將其映射為Java對象。 該表的每個字段都使用注釋映射到java對象中。 以下是我們實體的外觀。
JPA實體
package com.example.spring.springrestapp.dao.entity;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Table; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank;import org.springframework.data.annotation.Id;@Entity @Table(name = "user_info") public class UserInformation {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "USER_ID")private Integer userId;@Column(name = "FIRST_NAME")private String firstName;@Column(name = "LAST_NAME")private String lastName;@Column(name = "EMAIL")private String email;@Column(name = "ADDRESS")private String address;@Column(name = "PHONE")private Integer phone;public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName = firstName;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public Integer getPhone() {return phone;}public void setPhone(Integer phone) {this.phone = phone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;} }現在,創建Spring數據JPA存儲庫。 可以通過如下擴展接口JpaRepository來創建數據JPA存儲庫。 (請注意,您需要傳遞ID字段的實體和數據類型。在我的示例中,entity是User,而id字段的類型是Integer)
JPA存放區
package com.example.spring.springrestapp.dao.repo;import org.springframework.data.jpa.repository.JpaRepository; import com.example.spring.springrestapp.dao.entity.UserInformation; public interface UserRepo extends JpaRepository {}如此簡單,我們的DAO代碼已準備就緒! Spring負責生成基礎的DAO實現。
6.服務和控制器層
現在,我們創建一個服務類來保存用戶詳細信息。 您可以根據需要在方法中添加業務邏輯。
服務等級
@Service public class UserDetailService {@Autowiredprivate UserRepo userRepo;public UserInformation saveUser(UserInformation user) {return userRepo.save(user);} }現在讓我們創建一個控制器和API方法。 saveUser api在請求正文中接受json數據,然后在正文中以JSON形式返回響應。
控制器層
@RestController @RequestMapping("/api/user") public class SpringRestAppController {@Autowiredprivate UserDetailService userService;@PostMapping(value = "/save")public @ResponseBody UserInformation createUser(@RequestBody UserInformation user) {return userService.saveUser(user);} } @RequestMapping用于映射資源。
@PostMapping與分配給@RequestMapping HttpPost相同。
7.配置VO級別驗證
我們的API需要按照開頭提到的要求對其收到的數據進行驗證。 為此,我們將在實體級別應用數據驗證,如下所示。
數據驗證
@Entity @Table(name = "user_info") public class UserInformation {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "USER_ID")private Integer userId;@Column(name = "FIRST_NAME")@NotBlank(message = "first name can't be blank")private String firstName;@Column(name = "LAST_NAME")@NotBlank(message = "last name can't be blank")private String lastName;@Column(name = "EMAIL")@NotBlank(message = "email can't be blank")@Email(message = "invalid format")private String email;@Column(name = "ADDRESS")private String address;@Column(name = "PHONE")private Integer phone;請注意,注釋@NotBlank不允許為空或null值, @Email不能檢查有效的電子郵件格式。 此外,我們添加了驗證失敗的消息。
現在,我們需要告訴Spring按照實體中指定的注釋進行驗證。 為此,我們可以在請求有效負載上使用@Valid注釋,如下所示。
@PostMapping(value = "/save")public @ResponseBody User createUser(@RequestBody @Valid UserInformation user) {return userService.saveUser(user);}8.配置異常處理
驗證失敗時,我們需要將正確格式的錯誤響應提供給API使用方。 例如,如果沒有給出名字,我想以以下格式返回錯誤消息,并帶有HTTP錯誤代碼錯誤請求。 為API使用者提供異常堆棧跟蹤不是一個好主意。
{ "errorCode": "VALIDATION_FAILED", "message": "" } 我們可以在每個API控制器方法中執行此操作,也可以創建單個全局異常處理,從而避免出于相同需求在多個位置編寫重復代碼。
為了在一個地方處理中央異常,我們利用了Spring的錯誤處理程序。 在Spring 3.2中,提供了@ControllerAdvice以全球化異常/錯誤處理。 要返回錯誤響應,請創建一個具有錯誤代碼和消息的VO。
值對象中的錯誤處理
@JsonInclude(content = Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) public class ApiErrorVO {private String errorCode;private String message;public ApiErrorVO(String errorCode, String message) {super();this.errorCode = errorCode;this.message = message;}當驗證失敗時,Spring會拋出MethodArgumentNotValidException 。 我們可以捕獲此異常并從拋出的異常中提取錯誤消息。 我們使用@ExceptionHandler捕獲異常,如下所示。
異常處理
@ControllerAdvice public class ApiExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(code = HttpStatus.BAD_REQUEST)@ResponseBodypublic ApiErrorVO handleValidationError(MethodArgumentNotValidException ex) {BindingResult bindingResult = ex.getBindingResult();FieldError fieldError = bindingResult.getFieldError();String defaultMessage = fieldError.getDefaultMessage();return new ApiErrorVO("VALIDATION_FAILED", defaultMessage);} } @ResponseStatus用于指定HTTP錯誤的請求狀態。
@ResponseBody確保將錯誤寫入響應正文。
9.結論
現在讓我們測試一下API。
情況1:驗證失敗
網址: http://localhost:8080/restApp/api/user/save
RequestPayload:請注意空白的名字
響應:HTTP狀態為400
{ "errorCode": "VALIDATION_FAILED", "message": "first name can't be blank" } 情況2:提供所有必需值時
請求有效負載:
響應:HTTP狀態為200
{ "userId": 8, "firstName": "Alex", "lastName": "K", "email": "alexk@abc.com", "address": null, "phoneNumber": null }測試結束。
10.下載源代碼
下載您可以在此處下載完整的源代碼: SPRING DATA JPA
翻譯自: https://www.javacodegeeks.com/2018/08/spring-data-jpa-central-exception-handling-vo-validations-framework.html
總結
以上是生活随笔為你收集整理的具有中央异常处理和VO验证的Spring Data JPA –框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新车型备案(新款新车备案)
- 下一篇: 什么样的网站容易被百度收录(什么样的网站