Browse Source

添加统一验证的文档

LGH 5 years ago
parent
commit
4fdc3d26f1
1 changed files with 139 additions and 0 deletions
  1. 139 0
      doc/统一验证.md

+ 139 - 0
doc/统一验证.md

@@ -0,0 +1,139 @@
+我们后台使用`spring` 为我们提供好的统一校验的工具`spring-boot-starter-validation`对请求进行校验。
+
+```xml
+<dependency>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-validation</artifactId>
+</dependency>
+```
+
+这里通过注解封装了几种常用的校验
+
+- `@NotNull` 不能为null
+- `@NotEmpty` 不能为null、空字符串、空集合
+- `@NotBlank` 不能为null、空字符串、纯空格的字符串
+- `@Min` 数字最小值不能小于x
+- `@Max` 数字最大值不能大于x
+- `@Email` 字符串为邮件格式
+- `@Max` 数字最大值不能大于x
+- `@Size` 字符串长度最小为x、集合长度最小为x
+- `@Pattern` 正则表达式
+
+
+
+我们以`SysUser`为例,看看怎么使用
+
+```java
+public class SysUser implements Serializable {
+	private static final long serialVersionUID = 1L;
+	
+	/**
+	 * 用户ID
+	 *
+	 */
+	@TableId
+	private Long userId;
+
+	/**
+	 * 用户名
+	 */
+	@NotBlank(message="用户名不能为空")
+	@Size(min = 2,max = 20,message = "用户名长度要在2-20之间")
+	private String username;
+
+	/**
+	 * 密码
+	 */
+	@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
+	private String password;
+
+	/**
+	 * 邮箱
+	 */
+	@NotBlank(message="邮箱不能为空")
+	@Email(message="邮箱格式不正确")
+	private String email;
+
+	/**
+	 * 手机号
+	 */
+	@Pattern(regexp="0?1[0-9]{10}",message = "请输入正确的手机号")
+	private String mobile;
+
+	/**
+	 * 状态  0:禁用   1:正常
+	 */
+	private Integer status;
+	
+	/**
+	 * 用户所在店铺id
+	 */
+	private Long shopId;
+	
+	/**
+	 * 角色ID列表
+	 */
+	@TableField(exist=false)
+	private List<Long> roleIdList;
+	
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+
+}
+```
+
+
+
+我们在Controller层使用该bean,并使用`@Valid`注解,使校验的注解生效,如`SysUserController` :
+
+```java
+@RestController
+@RequestMapping("/sys/user")
+public class SysUserController {
+	/**
+	 * 保存用户
+	 */
+	@SysLog("保存用户")
+	@PostMapping
+	@PreAuthorize("@pms.hasPermission('sys:user:save')")
+	public ResponseEntity<String> save(@Valid @RequestBody SysUser user){
+		String username = user.getUsername();
+		SysUser dbUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
+				.eq(SysUser::getUsername, username));
+		if (dbUser!=null) {
+			return ResponseEntity.badRequest().body("该用户已存在");
+		}
+		user.setShopId(SecurityUtils.getSysUser().getShopId());
+		user.setPassword(passwordEncoder.encode(user.getPassword()));
+		sysUserService.saveUserAndUserRole(user);
+		return ResponseEntity.ok().build();
+	}
+}
+```
+
+
+
+并且在`DefaultExceptionHandlerConfig` 拦截由`@Valid` 触发的异常信息并返回:
+
+```java
+@Controller
+@RestControllerAdvice
+public class DefaultExceptionHandlerConfig {
+
+    @ExceptionHandler(BindException.class)
+    public ResponseEntity<String> bindExceptionHandler(BindException e){
+        e.printStackTrace();
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage());
+
+    }
+
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResponseEntity<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e){
+        e.printStackTrace();
+        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage());
+    }
+}
+```
+