SpringBoot參數(shù)驗(yàn)證(前后端分離設(shè)計(jì))

本文的框架使用的是SpringBoot1.5

1.前端表單層

代碼中的 @Getter,@Setter,@ToString 是使用的 lombok 用于替代傳統(tǒng)的 setter、getter 、toString方法。

@Getter
@Setter
@ToString
public class UserFormVo {
    /**
     * 用戶id,修改用戶時(shí)是必填項(xiàng)。增加用戶時(shí)不能傳輸
     */
    @NotNull(groups = Update.class, message = "用戶Id不能為空")
    @Null(groups = Add.class, message = "不能傳輸用戶Id")
    private Long id;

    /**
     * 用戶名
     */
    @NotEmpty(groups = Add.class, message = "用戶名不能為空")
//    @Null(groups = Update.class, message = "不能修改用戶名")
    @Size(min = 5, max = 20, message = "用戶名個(gè)數(shù)必須為5-20位")
    private String name;

    /**
     * 密碼。新增用戶時(shí)不能為空。修改用戶時(shí)不能修改用戶密碼
     */
    @NotNull(groups = Add.class, message = "密碼不能為空")
    @Null(groups = Update.class, message = "不能修改用戶密碼")
    private String password;

    /**
     * 用戶狀態(tài)。0禁用,1啟用
     */
    @NotNull(group = Add.class, message = "狀態(tài)不能為空")
    @Range(min = 0, max = 1, message = "狀態(tài)值不正確")
    private Integer status;

    /**
     * 繼承Default類,可以在不指定@Validated的group時(shí),使用所有默認(rèn)校驗(yàn)方式。
     */
    public interface Add extends Default {
    }

    public interface Update extends Default {
    }
}

2.controller層

校驗(yàn)操作是使用 @Validated 來實(shí)現(xiàn)的,通過里面指定的 class 文件來使用不同的注解分組

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 新增用戶
     * @Validated 中指定了校驗(yàn)分組,當(dāng)校驗(yàn)注解中有對(duì)應(yīng)的class時(shí),才會(huì)使用對(duì)應(yīng)的校驗(yàn)方式。由于Add.class繼承了Default,所以沒有指定分組的校驗(yàn)方式也會(huì)進(jìn)行調(diào)用
     * controller方法可以再添加一個(gè)BindingResult 來接收校驗(yàn)結(jié)果,當(dāng)前后端分離時(shí),因?yàn)槲覀円苯影彦e(cuò)誤返回前端,所以要直接獲取BindingResult中的報(bào)錯(cuò)信息。
     * @Return Response是自定義的返回類型。用于同一返回的格式
     */
    @PostMapping("/add")
    public Response addUser(@Validated(UserFormVo.Add.class) @RequestBody UserFormVo formVo) {
        userService.saveUser(formVo);
        return Response.success();
    }

    /**
     * 修改用戶
     */
    @PostMapping("/modify")
    public Response updateUser(@Validated(UserFormVo.Update.class) @RequestBody UserFormVo formVo) {
        userService.updateUser(formVo);
        return Response.success();
    }
}

3.GlobalExceptionHandler

當(dāng)前后端進(jìn)行分離設(shè)計(jì)時(shí),不推薦使用BindingResult來接收校驗(yàn)結(jié)果,controller的方法中不需要添加BindingResult參數(shù)。我改用使用GlobalExceptionHandler來處理錯(cuò)誤信息。

當(dāng)controller的方法中指定了@Validated,又沒有添加BindingResult參數(shù)時(shí),如果參數(shù)沒有通過校驗(yàn),就會(huì)直接拋出異常,拋出的異常,可以通過使用了@ControllerAdvice的 類進(jìn)行捕獲。

@RestController
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 用于處理參數(shù)校驗(yàn)錯(cuò)誤
     * @Validated校驗(yàn)失敗時(shí)會(huì)拋出MethodArgumentNotValidException異常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Response methodArgumentValidExceptionHandler(MethodArgumentNotValidException e) throws Exception {
        String code = "200001";
        String message = null;
        //如果拋出了異常,這個(gè)getErrorCount一定會(huì)>0
        if (e.getBindingResult().getErrorCount() > 0) {
            //校驗(yàn)會(huì)把所有不通過的選項(xiàng)的錯(cuò)誤信息記錄下來,現(xiàn)在先默認(rèn)給前端提供第一個(gè)錯(cuò)誤信息
            message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        }
        return new Response(code, message);
    }
    
    //...其他捕獲全局異常的代碼
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,968評(píng)論 1 92
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,282評(píng)論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,685評(píng)論 1 32
  • 沒有最后一次, 永遠(yuǎn)都是一次一次又一次。 我是我,你是你, 可是我們不是我們。 是的, 自己的喜怒哀樂和別人無關(guān),...
    三井微閱讀 318評(píng)論 0 1
  • 原來缺乏強(qiáng)大的知識(shí)體系, 看到的永遠(yuǎn)是冰山一角~ ——致這些年喝下的雞湯
    等愚齊閱讀 244評(píng)論 0 1

友情鏈接更多精彩內(nèi)容