postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator
前兩天項(xiàng)目群里發(fā)生了關(guān)于參數(shù)校驗(yàn)的問題討論,很多開發(fā)團(tuán)隊(duì)沒有對這些做硬性規(guī)范時(shí),還是有很多童鞋本著“不多事”的原則,產(chǎn)品文檔里沒有特別說明就不寫。對于2B的產(chǎn)品經(jīng)理來說,因?yàn)橐淮涡碌?#xff0c;可能回涉及到N多的頁面,只會定一個(gè)通用的規(guī)范,特殊情況下會做特別說明。這其實(shí)也很考研程序員的開發(fā)習(xí)慣和技術(shù)能力,所以花少今天給大家分享下如何進(jìn)行優(yōu)雅的參數(shù)校驗(yàn)
可能有些后端開發(fā)會覺得前端做好校驗(yàn)就可以了,但是作為有經(jīng)驗(yàn)的程序員來說你不要相信產(chǎn)品經(jīng)理、不要相信測試、也不要相信前端,你能信的只有自己。參數(shù)校驗(yàn)是后端請求的第一道防線,不符合條件的請求,越在前面攔截掉,消耗的資源越少。
對參數(shù)進(jìn)行校驗(yàn),我們可能會出現(xià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個(gè)字符");
}
if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {
return ApiResult.fail("密碼長度必須是6-16個(gè)字符");
}
if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$", user.getEmail())) {
return ApiResult.fail("郵箱格式不正確");
}
// 新增用戶操作
return ApiResult.success();
}
}
但是這樣總看起來像是初出茅廬的實(shí)習(xí)生寫的,作為有逼格的程序員還是要表現(xiàn)的高大上一點(diǎn),接下來Spring Validator閃亮登場
1、Validator + BindResult
首先在對象上通過注解的方式定義校驗(yàn)規(guī)則,并指定校驗(yàn)失敗后的信息,如下:
@Getter
@Setter
public class User {
@NotNull(message = "用戶id不能為空")
private Long id;
@NotNull(message = "用戶賬號不能為空")
@Size(min = 6, max = 11, message = "賬號長度必須是6-11個(gè)字符")
private String account;
@NotNull(message = "用戶密碼不能為空")
@Size(min = 6, max = 11, message = "密碼長度必須是6-16個(gè)字符")
private String password;
@NotNull(message = "用戶郵箱不能為空")
@Email(message = "郵箱格式不正確")
private String email;
}
這里花少用了Lombok插件通過注解方式自動生成Getter、Setter方法,還是挺省事的,如果想要了解Lombok的更多花絮可以看花少之前的文章有介紹,但是就像之前有位讀者提到這個(gè)有個(gè)弊端就是需要下插件,如果是公司內(nèi)部的大項(xiàng)目最好別用,否則別人也得下插件,萬一被噴就尷尬了,但是自己的項(xiàng)目隨便玩無所謂。
2、校驗(yàn)規(guī)則定義完后,在接口上添加@Vaild注解和BindResult參數(shù)即可完成校驗(yàn),如下:
@RestController
@RequestMapping("/user")
public class UserController extends BaseController {
@PostMapping("/add")
public ApiResult addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
// 參數(shù)校驗(yàn)失敗,會將錯(cuò)誤信息封裝成在BindingResult
for (ObjectError error : bindingResult.getAllErrors()) {
return ApiResult.fail(error.getDefaultMessage());
}
// 新增用戶操作
return ApiResult.success();
}
}
3、當(dāng)我們在訪問接口時(shí),未填寫用戶賬戶,則會返回如下結(jié)果:
{
"code": 500,
"data": null,
"message": "用戶賬號不能為空"
}
雖然使用該方式已經(jīng)是非常方便的進(jìn)行參數(shù)校驗(yàn)方式了,但是當(dāng)有多個(gè)接口需要進(jìn)行參數(shù)驗(yàn)證時(shí),就需要在每個(gè)接口中添加參數(shù)BindingResult,看到這么多冗余代碼,作為有追求的程序員小哥肯定受不鳥,我們可以通過異常統(tǒng)一處理來解決這個(gè)問題。關(guān)于異常的統(tǒng)一處理今天就不過多介紹了,后面找時(shí)間專門寫一篇供大家賞閱
花有重開日,人無再少年 → 我是花少【少宮主花無缺】#更新不斷,下期繼續(xù)#走過路過記得留下關(guān)注和點(diǎn)贊(公眾號同名)!
總結(jié)
以上是生活随笔為你收集整理的postmapping注解参数说明_从零搭建后端框架:优雅的参数校验Validator的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python pandas 日期_pyt
- 下一篇: php 接受 amp,php中amp;