java后端字段验证框架,(七)从零搭建后端框架——优雅地进行参数校验

前言

参数校验是后端请求的第一道防线,不符合条件的请求,越在前面拦截掉,消耗的资源越少。

对参数进行校验,我们可能会出现如下类似代码:

@RestController

@RequestMapping("/user")

public class UserController extends BaseController {

@PostMapping("/add")

public ApiResult addUser(@RequestBody User user) {

if (user == null) {

return ApiResult.fail("对象不能为空");

}

if (StringUtils.isEmpty(user.getAccount()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getEmail())) {

return ApiResult.fail("账号、密码或邮箱不能为空");

}

if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {

return ApiResult.fail("账号长度必须是6-11个字符");

}

if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {

return ApiResult.fail("密码长度必须是6-16个字符");

}

if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {

return ApiResult.fail("邮箱格式不正确");

}

// 新增用户操作

return ApiResult.success();

}

}

复制代码

这样实现并没有什么错,但是看起来实在不够优雅。

下面使用Spring Validator对该代码进行优化。

具体实现

Validator + BindResult

首先在对象上通过注解的方式定义校验规则,并指定校验失败后的信息,如下:

@Getter

@Setter

public class User {

@NotNull(message = "用户id不能为空")

private Long id;

@NotNull(message = "用户账号不能为空")

@Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")

private String account;

@NotNull(message = "用户密码不能为空")

@Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")

private String password;

@NotNull(message = "用户邮箱不能为空")

@Email(message = "邮箱格式不正确")

private String email;

}

复制代码

校验规则定义完后,在接口上添加@Vaild注解和BindResult参数即可完成校验,如下:

@RestController

@RequestMapping("/user")

public class UserController extends BaseController {

@PostMapping("/add")

public ApiResult addUser(@RequestBody @Valid User user, BindingResult bindingResult) {

// 参数校验失败,会将错误信息封装成在BindingResult

for (ObjectError error : bindingResult.getAllErrors()) {

return ApiResult.fail(error.getDefaultMessage());

}

// 新增用户操作

return ApiResult.success();

}

}

复制代码

当我们在访问接口时,未填写用户账户,则会返回如下结果:

{

"code": 500,

"data": null,

"message": "用户账号不能为空"

}

复制代码

使用该方式已经是非常方便的进行参数校验方式了。

但是不难发现,当有多个接口需要进行参数验证时,就需要在每个接口中添加参数BindingResult。

重复写如下代码:

// 参数校验失败,会将错误信息封装成在BindingResult

for (ObjectError error : bindingResult.getAllErrors()) {

return ApiResult.fail(error.getDefaultMessage());

}

复制代码

程序员可不是只会Ctrl+C和Ctrl+V的,我们可以通过异常统一处理来解决这个问题。

Validator + 异常统一处理

如果在接口中不添加参数BindingResult,校验失败则会抛出MethodArgumentNotValidException异常,在异常中包含校验失败的信息。

e4244ee39ac60fe67bc9d8da57b3854d.png

所以只要统一处理MethodArgumentNotValidException异常即可。

在【异常统一处理的三种方式】这一篇文章中,

介绍了三种异常统一处理的方式,这里使用@ControllerAdvice + @ExceptionHandler的方式

@Slf4j

@ControllerAdvice

public class GlobalExceptionHandler {

/**

* MethodArgumentNotValidException 异常处理

*/

@ResponseBody

@ExceptionHandler(MethodArgumentNotValidException.class)

public ApiResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {

BindingResult bindingResult = e.getBindingResult();

for (ObjectError error : bindingResult.getAllErrors()) {

// 返回检验信息

return ApiResult.fail(error.getDefaultMessage());

}

return ApiResult.fail("服务异常,请稍后重试");

}

}

复制代码

在对异常进行统一处理后,在接口中只需添加注解@Vaild即可,相当的简洁。

@RestController

@RequestMapping("/user")

public class UserController extends BaseController {

@PostMapping("/add")

public ApiResult addUser(@RequestBody @Valid User user) {

// 新增用户操作

return ApiResult.success();

}

}

复制代码

至此,已经能很优雅的使用参数校验。

但是别以为这样就万事大吉了。虽然默认提供的注解能够校验绝大部分的情况,但是还有一些特殊的情况,比如校验用户手机号,这没有现成的Validator。

这时,就需要自定义Validator。

自定义Validator

需要自定义注解和实现校验逻辑。

这里定义注解@Phone,来校验手机号格式:

@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})

@Retention(RUNTIME)

@Documented

@Constraint(validatedBy = {PhoneValidator.class})

public @interface Phone {

String message() default "手机号格式不正确";

Class>[] groups() default {};

Class extends Payload>[] payload() default {};

}

复制代码

@Constraint(validatedBy = {PhoneValidator.class}) 用来指定校验类为PhoneValidator。

public class PhoneValidator implements ConstraintValidator {

@Override

public boolean isValid(String phone, ConstraintValidatorContext context) {

// 校验手机格式

return Pattern.matches("^1[3-9]\\d{9}", phone);

}

}

复制代码

这样就能够通过@Phone来校验手机号格式。

public class User {

@NotNull(message = "用户手机号不能为空")

@Phone(message = "手机号格式不正确")

private String phone;

}

复制代码

总结

通过Validator和异常统一处理,很优雅的实现了参数校验。并通过自定义Validator,可以实现各种复杂的校验。

感谢阅读,如果感觉有帮助的话,不妨随手点个赞!

源码

github.com/zhuqianchan…

往期回顾

(一)从零搭建后端框架——构建SpringBoot项目

(二)从零搭建后端框架——SpringBoot自定义Banner

(三)从零搭建后端框架——SpringBoot集成Swagger2

(四)从零搭建后端框架——SpringBoot集成Lombok

(五)从零搭建后端框架——统一基类、接口、返回对象设计

(六)从零搭建后端框架——异常统一处理的三种方式

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[(七)从零搭建后端框架——优雅地进行参数校验]http://www.zyiz.net/tech/detail-136664.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在这篇文章中,我们将讨论如何从开始搭建Java后台管理系统。在开始之前,确保您已经安装了Java开发工具包(JDK)和Eclipse集成开发环境(IDE)。 1.选择适当的框架 在开始之前,我们需要选择一个适合我们项目的框架Java有许多优秀的框架可供选择,例如Spring、Struts和Hibernate等。在本文中,我们将使用Spring框架来构建我们的后台管理系统。 2.创建Maven项目 我们使用Maven来管理我们的项目依赖项并构建我们的项目。使用Eclipse IDE,我们可以轻松地创建一个Maven项目。打开Eclipse并选择“File”>“New”>“Other”,然后选择“Maven”>“Maven Project”。 在下一个界面中,我们需要选择Maven项目的类型。我们选择“maven-archetype-webapp”,因为我们将构建一个Web应用程序。 3.添加Spring依赖项 我们已经创建了一个Maven项目,现在我们需要添加Spring框架的依赖项。在Maven项目中,我们可以通过编辑pom.xml文件来添加依赖项。 在pom.xml文件中,我们需要添加以下依赖项: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.0.RELEASE</version> </dependency> ``` 4.创建Spring配置文件 现在我们已经添加了Spring框架的依赖项,我们需要创建一个Spring配置文件。在Maven项目中,我们可以在“src/main/resources”目录下创建一个名为“applicationContext.xml”的文件。 在这个文件中,我们可以配置Spring框架的各种组件,例如控制器、服务和数据访问对象(DAO)等。 5.创建控制器 现在我们已经创建了Spring配置文件,我们需要创建一个控制器来处理Web请求。在Maven项目中,我们可以在“src/main/java”目录下创建一个包,然后在该包中创建一个控制器类。 控制器类应该使用Spring的@Controller注释进行注释,并且应该具有处理Web请求的方法。例如,以下代码片段显示了一个控制器类,它具有一个处理GET请求的方法: ``` @Controller public class HomeController { @RequestMapping(value = "/", method = RequestMethod.GET) public String home(ModelMap model) { model.addAttribute("message", "Hello World!"); return "home"; } } ``` 6.创建视图 现在我们已经创建了控制器,我们需要为该控制器创建一个视图。在Maven项目中,我们可以在“src/main/webapp/WEB-INF/views”目录下创建一个JSP文件。 在JSP文件中,我们可以使用JSTL(JavaServer Pages标准标记库)和EL(表达式语言)来显示动态内容。例如,以下代码片段显示了一个简单的JSP文件,它显示一个消息: ``` <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>Spring MVC Example</title> </head> <body> <h1>${message}</h1> </body> </html> ``` 7.启动应用程序 现在我们已经创建了控制器和视图,我们需要启动我们的应用程序。在Eclipse IDE中,我们可以右键单击Maven项目,然后选择“Run As”>“Maven Build”。在“Goals”字段中输入“tomcat7:run”,然后单击“Run”按钮。 现在我们可以在Web浏览器中输入“http://localhost:8080/”来访问我们的应用程序。 这就是从开始搭建Java后台管理系统的基础。随着我们的项目的增长,我们可以添加更多的功能和组件来满足我们的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值