java項目統一驗證

我們後臺使用spring 爲我們提供好的統一校驗的工具spring-boot-starter-validation對請求進行校驗。

<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爲例,看看怎麼使用

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

@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 觸發的異常信息並返回:

@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());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章