javascript
具有中央异常处理和VO验证的Spring Data JPA –框架
1.簡(jiǎn)介
一段時(shí)間以來(lái),Spring框架已成為事實(shí)上的標(biāo)準(zhǔn),可以創(chuàng)建任何基于REST API的應(yīng)用程序。 Spring提供了各種現(xiàn)成的組件,以避免編寫(xiě)重復(fù)而繁瑣的樣板代碼。 另外,關(guān)于Spring的美麗之處在于,如果有現(xiàn)成的解決方案,它就可以解決。 它為您提供了與現(xiàn)有庫(kù)/框架集成的簡(jiǎn)便方法。 在本文中,讓我們看看如何使用全棧Spring技術(shù)編寫(xiě)基于Spring的RESTful API。 Spring Boot,Spring Validations和Spring數(shù)據(jù)JPA的示例顯示了以下方面的完整信息:
- Spring Boot及其配置
- 使用Spring Boot Starters進(jìn)行依賴(lài)管理
- 使用Spring數(shù)據(jù)JPA避免瓶頸DAO代碼。
- Spring支持VO級(jí)別的驗(yàn)證。
- 集中式異常處理。
我們使用Gradle進(jìn)行依賴(lài)管理并作為構(gòu)建工具。 讓我們逐步進(jìn)行。
2.生成項(xiàng)目
這是生成項(xiàng)目所需遵循的步驟。
2.1 Spring Intializer
Spring在此位置Spring INITIALIZR提供了易于啟動(dòng)的項(xiàng)目生成工具。 在此網(wǎng)頁(yè)上,您可以通過(guò)添加所需的依賴(lài)項(xiàng)來(lái)引導(dǎo)應(yīng)用程序。 您可以通過(guò)添加下面提到的3個(gè)依賴(lài)項(xiàng)來(lái)生成項(xiàng)目框架(請(qǐng)參見(jiàn)下圖以清楚了解)。
1.'Web':此依賴(lài)關(guān)系是編碼Web層和創(chuàng)建API所必需的。 生成項(xiàng)目后,它在build.gralde文件中顯示為以下依賴(lài)項(xiàng)。
compile('org.springframework.boot:spring-boot-starter-web') 2.'Validation':啟用彈簧驗(yàn)證。 它在build.gradle中顯示為以下依賴(lài)項(xiàng)。 compile('org.springframework.boot:spring-boot-starter-validation') 3.'JPA':啟用彈簧數(shù)據(jù)JPA。 它在build.gradle中顯示為以下依賴(lài)項(xiàng)。 compile('org.springframework.boot:spring-boot-starter-data-jpa')
彈簧初始化器
2.2 Eclipse配置
生成項(xiàng)目并將其導(dǎo)入到Eclipse中。 完成此操作后,就可以創(chuàng)建API。 在eclipse中導(dǎo)入的項(xiàng)目應(yīng)如下所示。
項(xiàng)目結(jié)構(gòu)
3.創(chuàng)建API
在編寫(xiě)API之前,讓我們根據(jù)Java約定創(chuàng)建包,如下所示。
Java包
使用生成的代碼,我們?cè)诟蝎@得一個(gè)類(lèi),即com.example.spring.springrestapp。 這是我們的啟動(dòng)類(lèi)。
入門(mén)班
注意:應(yīng)該使用默認(rèn)配置在根軟件包級(jí)別創(chuàng)建啟動(dòng)類(lèi)。
現(xiàn)在,讓我們繼續(xù)創(chuàng)建控制器類(lèi)和API方法,以向數(shù)據(jù)庫(kù)添加用戶(hù)詳細(xì)信息。 對(duì)于我們將要構(gòu)建的該API,讓我們假設(shè)一些約束作為我們的要求:
- 該API應(yīng)該收集用戶(hù)的名字,姓氏,電子郵件,地址和電話(huà)號(hào)碼并將其存儲(chǔ)在MySQL DB中
- API調(diào)用者將姓,名和電子郵件作為必填字段傳遞。 電子郵件應(yīng)經(jīng)過(guò)格式驗(yàn)證。
- 家庭住址和電話(huà)號(hào)碼可以是可選的。
4.配置數(shù)據(jù)庫(kù)詳細(xì)信息:
對(duì)于此項(xiàng)目,您需要運(yùn)行MySQL DB的本地實(shí)例。 您可以在application.properties中提供數(shù)據(jù)庫(kù)詳細(xì)信息,如下所示。
應(yīng)用特性
spring.datasource.url = jdbc:mysql://localhost:3306/boot_app spring.datasource.username = root spring.datasource.password = root在MySQL DB中,使用以下腳本在MySQL DB中創(chuàng)建一個(gè)包含名字,姓氏,電子郵件,地址和電話(huà)號(hào)碼的表。
創(chuàng)建表腳本
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
表準(zhǔn)備好后,我們需要使用JPA將其映射為Java對(duì)象。 該表的每個(gè)字段都使用注釋映射到j(luò)ava對(duì)象中。 以下是我們實(shí)體的外觀。
JPA實(shí)體
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;} }現(xiàn)在,創(chuàng)建Spring數(shù)據(jù)JPA存儲(chǔ)庫(kù)。 可以通過(guò)如下擴(kuò)展接口JpaRepository來(lái)創(chuàng)建數(shù)據(jù)JPA存儲(chǔ)庫(kù)。 (請(qǐng)注意,您需要傳遞ID字段的實(shí)體和數(shù)據(jù)類(lèi)型。在我的示例中,entity是User,而id字段的類(lèi)型是Integer)
JPA存放區(qū)
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 {}如此簡(jiǎn)單,我們的DAO代碼已準(zhǔn)備就緒! Spring負(fù)責(zé)生成基礎(chǔ)的DAO實(shí)現(xiàn)。
6.服務(wù)和控制器層
現(xiàn)在,我們創(chuàng)建一個(gè)服務(wù)類(lèi)來(lái)保存用戶(hù)詳細(xì)信息。 您可以根據(jù)需要在方法中添加業(yè)務(wù)邏輯。
服務(wù)等級(jí)
@Service public class UserDetailService {@Autowiredprivate UserRepo userRepo;public UserInformation saveUser(UserInformation user) {return userRepo.save(user);} }現(xiàn)在讓我們創(chuàng)建一個(gè)控制器和API方法。 saveUser api在請(qǐng)求正文中接受json數(shù)據(jù),然后在正文中以JSON形式返回響應(yīng)。
控制器層
@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級(jí)別驗(yàn)證
我們的API需要按照開(kāi)頭提到的要求對(duì)其收到的數(shù)據(jù)進(jìn)行驗(yàn)證。 為此,我們將在實(shí)體級(jí)別應(yīng)用數(shù)據(jù)驗(yàn)證,如下所示。
數(shù)據(jù)驗(yàn)證
@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;請(qǐng)注意,注釋@NotBlank不允許為空或null值, @Email不能檢查有效的電子郵件格式。 此外,我們添加了驗(yàn)證失敗的消息。
現(xiàn)在,我們需要告訴Spring按照實(shí)體中指定的注釋進(jìn)行驗(yàn)證。 為此,我們可以在請(qǐng)求有效負(fù)載上使用@Valid注釋,如下所示。
@PostMapping(value = "/save")public @ResponseBody User createUser(@RequestBody @Valid UserInformation user) {return userService.saveUser(user);}8.配置異常處理
驗(yàn)證失敗時(shí),我們需要將正確格式的錯(cuò)誤響應(yīng)提供給API使用方。 例如,如果沒(méi)有給出名字,我想以以下格式返回錯(cuò)誤消息,并帶有HTTP錯(cuò)誤代碼錯(cuò)誤請(qǐng)求。 為API使用者提供異常堆棧跟蹤不是一個(gè)好主意。
{ "errorCode": "VALIDATION_FAILED", "message": "" } 我們可以在每個(gè)API控制器方法中執(zhí)行此操作,也可以創(chuàng)建單個(gè)全局異常處理,從而避免出于相同需求在多個(gè)位置編寫(xiě)重復(fù)代碼。
為了在一個(gè)地方處理中央異常,我們利用了Spring的錯(cuò)誤處理程序。 在Spring 3.2中,提供了@ControllerAdvice以全球化異常/錯(cuò)誤處理。 要返回錯(cuò)誤響應(yīng),請(qǐng)創(chuàng)建一個(gè)具有錯(cuò)誤代碼和消息的VO。
值對(duì)象中的錯(cuò)誤處理
@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;}當(dāng)驗(yàn)證失敗時(shí),Spring會(huì)拋出MethodArgumentNotValidException 。 我們可以捕獲此異常并從拋出的異常中提取錯(cuò)誤消息。 我們使用@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錯(cuò)誤的請(qǐng)求狀態(tài)。
@ResponseBody確保將錯(cuò)誤寫(xiě)入響應(yīng)正文。
9.結(jié)論
現(xiàn)在讓我們測(cè)試一下API。
情況1:驗(yàn)證失敗
網(wǎng)址: http://localhost:8080/restApp/api/user/save
RequestPayload:請(qǐng)注意空白的名字
響應(yīng):HTTP狀態(tài)為400
{ "errorCode": "VALIDATION_FAILED", "message": "first name can't be blank" } 情況2:提供所有必需值時(shí)
請(qǐng)求有效負(fù)載:
響應(yīng):HTTP狀態(tài)為200
{ "userId": 8, "firstName": "Alex", "lastName": "K", "email": "alexk@abc.com", "address": null, "phoneNumber": null }測(cè)試結(jié)束。
10.下載源代碼
下載您可以在此處下載完整的源代碼: SPRING DATA JPA
翻譯自: https://www.javacodegeeks.com/2018/08/spring-data-jpa-central-exception-handling-vo-validations-framework.html
總結(jié)
以上是生活随笔為你收集整理的具有中央异常处理和VO验证的Spring Data JPA –框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新车型备案(新款新车备案)
- 下一篇: gradle idea java ssm