俗话说没有规矩不成方圆。目前随着IT行业的内卷,我发现很多公司目前有这样的趋势:
1个团队里面招 1 2个稍微贵的经验丰富的员工,然后剩下的招聘的是一些初级的员工(主要是便宜),然后组成了小马拉大车的团队模式。
此时的话,这种团队如果行情好的话,那么离职率肯定是最高的。但是迫于现在行情不好,IT行业内卷厉害,所以对于这样的团队来说,我们作为团队leader的话就要注重一下整体的代码规范。因为如果大家编写的代码参差不齐,到后面肯定是很难修改的,也存储非常多隐藏的问题。所以这里的话我们来编写一套后端编码规范的系列。把团队大体的编码风格先规范好,后期可以减少很多不必要的麻烦。
这个系列主要是针对写web接口的后端开发人员的编码规范。本文主要介绍的是参数校验。
在代码里面我们要严格要求对参数进行校验。这是必须做的一件事情,对于参数校验的话,我们一般会涉及到如下的校验项:
1、非空检查 2、金额范围检查 3、长度校验 4、必要的正则校验 5、等等
对于参数校验来说,我们常使用的解决方案是:Validator + 自动抛出异常。也就是大家经常使用hibernate-validator框架,他支持的校验范围有:
上图是我们常用的一些参数校验的注解,大家可以熟悉一下。
使用上诉的注解,如果出现了参数校验错误的话,那么会自动抛出所对应的异常,然后咱们使用全局异常进行统一的捕获即可保持所有接口的返回值一样。下面我们来实践个案例。
1)编写一个model类
一般对于请求的参数来说,我们经常使用json的格式来进行传递,所以我们要求除了get方式之外,其他的请求方式统一使用json的格式传递参数到后端,所以后端需要提前定义一个model出来,假设我们现在是一个登录的场景,要求用户输入用户名和密码来进行登录,那么请求的model示例如下:
@Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class LoginReuqest implements Serializable { /** * */ private static final long serialVersionUID = 4824273035410072985L; @NotNull(message = "用户id不能为空") private String username; @NotNull(message = "用户密码不能为空") @Size(min = 6, max = 11, message = "密码长度必须是6-16个字符") private String password; }
这里我们使用Validator注解对用户名和密码进行判空及长度的判断。
2)编写接口
接下来我们再编写一个登录的接口,代码示例如下:
@RequestMapping("/login") public BaseResponse login(@RequestBody @Validated LoginReuqest user) { return BaseResponse.ok(); }
这里我们在request的model前面添加了@Validated注解,使我们前面在model里面定义的注解执行逻辑生效。切记一定要添加上这个注解,如果不加这个注解,那么对应的参数判断逻辑注解就不会生效。
3)编写全局异常处理
编写controlleradvice的作用主要是当出现异常的时候,我们提取异常的信息,然后组装成对应的数据结构返回回去。示例代码如下:
package com.mybatis.demo.exception; import java.util.List; import java.util.stream.Collectors; import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import com.google.common.base.Joiner; import com.mybatis.demo.http.BaseResponse; import com.mybatis.demo.http.HttpCode; @RestControllerAdvice public class ServerExceptionHandler { //使用json请求体调用接口,校验异常抛出 MethodArgumentNotValidException(低版本) @ExceptionHandler(MethodArgumentNotValidException.class) public BaseResponse MethodArgumentNotValidException(MethodArgumentNotValidException e) { List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors(); List<String> collect = fieldErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); return BaseResponse.error(HttpCode.PARAMSERROR.getCode(), Joiner.on(",").join(collect)); } //使用form请求体调用接口,校验异常抛出 BindException(低版本),高版本目前都抛出Bind异常 @ExceptionHandler(BindException.class) public BaseResponse BindException(BindException e) { List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors(); List<String> collect = fieldErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); return BaseResponse.error(HttpCode.PARAMSERROR.getCode(), Joiner.on(",").join(collect)); } }
这里我们捕获两个异常,分别是:MethodArgumentNotValidException和BindException异常,对于高版本来说,我们可以只捕获BindException异常即可。
4)测试运行
这里我们把项目运行起来,然后调用一下:
可以看到这里这里已经把所有不符合的异常信息都给抛出来了,此时前端就可以根据抛出的异常,挨个进行整改。保证前后端的接口顺利对接开发。
备注:
1、参数校验是后端开发里面必须做的事情。 2、实际情况中需要根据具体的业务来进行参数的校验。 3、除了后端做基本的参数校验之外,前端其实也需要硬性的做一些简单的参数校验。
最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...