具有中央异常处理和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')

Spring Data JPA-Spring初始化器

弹簧初始化器

2.2 Eclipse配置

生成项目并将其导入到Eclipse中。 完成此操作后,就可以创建API。 在eclipse中导入的项目应如下所示。

Spring Data JPA-项目结构

项目结构

3.创建API

在编写API之前,让我们根据Java约定创建包,如下所示。

Spring Data JPA-Java软件包

Java包

使用生成的代码,我们在根包中获得一个类,即com.example.spring.springrestapp。 这是我们的启动类。

Spring Data JPA-启动类

入门班

注意:应该使用默认配置在根软件包级别创建启动类。
现在,让我们继续创建控制器类和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:请注意空白的名字

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

响应:HTTP状态为400

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

情况2:提供所有必需值时
请求有效负载:

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

响应: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[渝粤题库]西北工业大学统计学

窗体顶端 一. 单选题 (共35题,共70分) 1. 有A、B两单位,A单位工人的平均工资为1100元,标准差为125元,B单位资料如下表1所示: 根据表1资料,计算B单位工人平均工资为( 1050元 &#…

matlab获得矩阵行数或列数的函数

1、ndims(A)返回A的维数 例子:(行,列)(400,2)的二维数组返回2 2、size(A)返回A各个维的最大元素个数 例子:(行,列)(400,2&…

【渝粤题库】国家开放大学2021春2402外国文学题目

试卷代号:2402 2021年春季学期期末统一考试 外国文学 试题(开卷) 2021年7月 一、埴空颖(共30分) (一)写出下列作品的作者(每空1分,共10分) 1.《俄狄浦斯王》_______________________…

【渝粤题库】国家开放大学2021春2517社区工作题目

试卷代号:2517 2021年春季学期期末统一考试 社区工作试题 2021年7月 一、单项选择题(每小题2分,共20分,将正确答案选项的字母填入括号内) 1.内地的社区工作是指社区专职工作者在党和政府的领导下,依靠( )&a…

初识斯蒂尔杰斯积分(Stieltjes integral)

https://blog.csdn.net/Northernland/article/details/83051415

【渝粤题库】国家开放大学2021春2704植物学基础题目

试卷代号: 2704 2021年春季学期期末统一考试 植物学基础 试题 2021年7月 一、单项选择题(共15分,每题3分) 1.下列哪一项不属于胚的结构( )。 A.胚根 B.胚芽 C.胚轴 D.胚乳 2.在有丝分裂过程中,染色体排列到细胞中央赤道…

drools6.5_使用Drools 6.0进行部署

drools6.5KieScanner 6.0 KieScanner取代了5.x KnowledgeAgent。 它使用嵌入式Maven允许在运行时解析和检索jar。 6.0应用程序现在可以轻松支持依赖关系和可传递依赖关系; 使用众所周知的Maven语义进行版本控制。 它允许在类路径上部署,也可以在运行时动…

【渝粤题库】国家开放大学2021春2773特种动物养殖题目

试卷代号:2773 2021年春季学期期末统一考试 特种动物养殖 试题 2021年7月 一、单项选择题(共15分,每小题3分) 1.家兔是“刺激性排卵”动物,在交配后( )小时排卵,在非发情期配种也可能受孕。 A.8&#xff5e…

双子(Dioid)

双子代数是若其对任意无限多元的 “和”封闭且乘法对此无限和具分配律。 https://baike.baidu.com/item/%E5%8F%8C%E5%AD%90%E4%BB%A3%E6%95%B0

【渝粤题库】国家开放大学2021春3907安全原理题目

试卷代号:3907 2021年春季学期期末统一考试 安全原理 试题(开卷) 2021年7月 一、单项选择题(每题3分,共30分) 1.博德认为:管理者应该充分发挥管理机能中的( )机能,有效地控制人的不安…

具有外部Zookeeper集成并使用SOLRJ API访问数据的SOLR cloud 7.4集群配置

SOLR是最流行且高度可扩展的搜索引擎之一,它基于分布式索引技术运行。 Solr索引几乎可以基于任何类型的数据源(CSV数据或XML数据或从RDBMS数据库或标准文件系统中提取的数据)构建。 对于以RDBMS数据库作为后端构建的任何Web应用程序&#xf…

【渝粤题库】国家开放大学2021春3990产品管理题目

试卷代号:3990 2021年春季学期期末统一考试 产品管理 试题 2021年7月 一、单项选择题(在备选答案中,有一个正确答案,请将正确答案的字母填入括号内。每小题2分,共20分) 1.在生产销售方面,只要产…

【渝粤题库】广东开放大学 大学英语1 形成性考核

选择题 题目: 题干 I’ll try and find ____ the name of the person who saved my life yesterday. 题目:They()have a share. 题目:()child enjoys Christmas. 题目:My pen is lo…

随机过程及其稳态stability

1. 为什么要研究随机过程? 人类认识世界的历史,就是一认识和描绘各种运动的历史,从宏观的天体运动到分子的运动,到人心理的运动-我们通称为变化,就是一个东西随时间的改变。 人们最成功的描绘运动的模型是牛顿的天体…

【渝粤题库】广东开放大学 税务会计技术 形成性考核

选择题 题目: 税收法律关系中的权利客体是指( )。 选择一项: 题目: 在税负能够转嫁的条件下,纳税人并不一定是( )。 选择一项: 题目: 税收采取的是&#xf…

【渝粤题库】广东开放大学 人力资源管理(本科) 形成性考核

选择题 题目:巴甫洛夫通过教会狗听到铃声后做出分泌唾液反应的研究得出的理论 题目:当职位空缺有许多种,而且在某一特定地区内又有足够的求职者的情况下,应该使用以下哪种招募式 题目:传统培训培养员工完成本职工作所需…

求离散马尔科夫链的平稳分布+按照一定概率分布生成想要的样本

1. 求离散马尔科夫链的平稳分布的两种解法 假设离散马尔科夫链的转移矩阵为P PP,平稳分布为π \piπ,则平稳分布满足: PππP \pi \piPππ 1.1 迭代法 求平稳分布的一种简单方法是迭代法,即随机初始化初始分布π 0 \pi_0π 0 …

使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述

如今,人们需要具有高用户体验的高响应性,交互式应用程序,这通常意味着处理异步性,尤其是当这些应用程序涉及高负载,实时数据和多用户时。 由于Java是一种固有的支持命令式编程风格的面向对象语言,因此异步…

【渝粤题库】广东开放大学 商务办公软件应用与实践 形成性考核

选择题 题目:要复制字符格式而不复制字符,需用()按钮。 题目:3、在Excel 2010的"开始”选项卡的"剪贴板”组中,不包含的按钮是()。 题目:4、启动Excel 2010后,…

【渝粤题库】广东开放大学 市场营销 形成性考核

选择题 题目: 以"顾客需要什么,我们就生产供应什么”作为其座右铭的企业是()企业。 题目: 市场营销学作为一门独立的经营管理学科诞生于20世纪初的()。 题目: 市场营销学&quo…