日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

具有中央异常处理和VO验证的Spring Data JPA –框架

發(fā)布時(shí)間:2023/12/3 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 具有中央异常处理和VO验证的Spring Data JPA –框架 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)注意空白的名字

{ "firstName":"", "lastName":"K", "email":"alexk@abc.com" }

響應(yīng):HTTP狀態(tài)為400

{ "errorCode": "VALIDATION_FAILED", "message": "first name can't be blank" }

情況2:提供所有必需值時(shí)
請(qǐng)求有效負(fù)載:

{ "firstName":"Alex", "lastName":"K", "email":"alexk@abc.com" }

響應(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。