postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator
前兩天項目群里發生了關于參數校驗的問題討論,很多開發團隊沒有對這些做硬性規范時,還是有很多童鞋本著“不多事”的原則,產品文檔里沒有特別說明就不寫。對于2B的產品經理來說,因為一次新迭代,可能回涉及到N多的頁面,只會定一個通用的規范,特殊情況下會做特別說明。這其實也很考研程序員的開發習慣和技術能力,所以花少今天給大家分享下如何進行優雅的參數校驗
可能有些后端開發會覺得前端做好校驗就可以了,但是作為有經驗的程序員來說你不要相信產品經理、不要相信測試、也不要相信前端,你能信的只有自己。參數校驗是后端請求的第一道防線,不符合條件的請求,越在前面攔截掉,消耗的資源越少。
對參數進行校驗,我們可能會出現如下類似代碼:
@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閃亮登場
1、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;
}
這里花少用了Lombok插件通過注解方式自動生成Getter、Setter方法,還是挺省事的,如果想要了解Lombok的更多花絮可以看花少之前的文章有介紹,但是就像之前有位讀者提到這個有個弊端就是需要下插件,如果是公司內部的大項目最好別用,否則別人也得下插件,萬一被噴就尷尬了,但是自己的項目隨便玩無所謂。
2、校驗規則定義完后,在接口上添加@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();
}
}
3、當我們在訪問接口時,未填寫用戶賬戶,則會返回如下結果:
{
"code": 500,
"data": null,
"message": "用戶賬號不能為空"
}
雖然使用該方式已經是非常方便的進行參數校驗方式了,但是當有多個接口需要進行參數驗證時,就需要在每個接口中添加參數BindingResult,看到這么多冗余代碼,作為有追求的程序員小哥肯定受不鳥,我們可以通過異常統一處理來解決這個問題。關于異常的統一處理今天就不過多介紹了,后面找時間專門寫一篇供大家賞閱
花有重開日,人無再少年 → 我是花少【少宮主花無缺】#更新不斷,下期繼續#走過路過記得留下關注和點贊(公眾號同名)!
總結
以上是生活随笔為你收集整理的postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pandas 日期_pyt
- 下一篇: 多帧点云数据拼接合并_PCL点云处理实践