這篇文章主要介紹了SpringBoot2.X Kotlin之數據校驗和異常處理的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站專注于企業(yè)網絡營銷推廣、網站重做改版、那曲網站定制設計、自適應品牌網站建設、H5響應式網站、購物商城網站建設、集團公司官網建設、成都外貿網站建設公司、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為那曲等各大城市提供網站開發(fā)制作服務。
在開發(fā)項目時,我們經常需要在前后端都校驗用戶提交的數據,判斷提交的數據是否符合我們的標準,包括字符串長度,是否為數字,或者是否為手機號碼等;這樣做的目的主要是為了減少SQL注入攻擊的風險以及臟數據的插入。提到數據校驗我們通常還會提到異常處理,因為為了安全起見,后端出現(xiàn)的異常我們通常不希望直接拋到客戶端,而是經過我們的處理之后再返回給客戶端,這樣做主要是提升系統(tǒng)安全性,另外就是給予用戶友好的提示。
定義實體并加上校驗注解
class StudentForm() { @NotBank(message = '生日不能為空') var birthday: String = "" @NotBlank(message = "Id不能為空") var id:String = "" @NotBlank(message = "年齡不能為空") var age:String = "" @NotEmpty(message = "興趣愛好不能為空") var Interests:List<String> = Collections.emptyList() @NotBlank(message = "學校不能為空") var school: String = "" override fun toString(): String { return ObjectMapper().writeValueAsString(this) } }
這里首先使用的是基礎校驗注解,位于javax.validation.constraints下,常見注解有@NotNull、@NotEmpty、@Max、@Email、@NotBank、@Size、@Pattern,當然出了這些還有很多注解,這里就不在一一講解,想了解更多的可以咨詢查看jar包。
這里簡單講解一下注解的常見用法:
@NotNull: 校驗一個對象是否為Null
@NotBank: 校驗字符串是否為空串
@NotEmpty: 校驗List、Map、Set是否為空
@Email: 校驗是否為郵箱格式
@Max @Min: 校驗Number或String是否在指定范圍內
@Size: 通常需要配合@Max @Min一期使用
@Pattern: 配合自定義正則表達式校驗
定義返回狀態(tài)枚舉
enum class ResultEnums(var code:Int, var msg:String) { SUCCESS(200, "成功"), SYSTEM_ERROR(500, "系統(tǒng)繁忙,請稍后再試"), }
自定義異常
這里主要是參數校驗,所以定義一個運行時異常,代碼如下:
class ParamException(message: String?) : RuntimeException(message) { var code:Int = ResultEnums.SUCCESS.code constructor(code:Int, message: String?):this(message) { this.code = code } }
統(tǒng)一返回結構體定義
class ResultVo<T> { var status:Int = ResultEnums.SUCCESS.code var msg:String = "" var data:T? = null constructor() constructor(status:Int, msg:String, data:T) { this.status = status this.data = data this.msg = msg } override fun toString(): String { return ObjectMapper().writeValueAsString(this) } }
全局異常處理
這里的全局異常處理,是指請求到達Controller層之后發(fā)生異常處理。代碼如下:
@RestControllerAdvice class RestExceptionHandler { private val logger:Logger = LoggerFactory.getLogger(this.javaClass) @ExceptionHandler(Exception::class) @ResponseBody fun handler(exception: Exception): ResultVo<String> { logger.error("全局異常:{}", exception) return ResultVo(500, "系統(tǒng)異常", "") } @ExceptionHandler(ParamException::class) @ResponseBody fun handler(exception: ParamException): ResultVo<String> { logger.error("參數異常:{}", exception.localizedMessage) return ResultVo(exception.code, exception.localizedMessage, "") } }
這里得和Java處理的方式大同小異,無疑就是更加簡潔了而已。
編寫校驗工具
object ValidatorUtils { private val validator = Validation.buildDefaultValidatorFactory().validator /** * 校驗對象屬性 * @param obj 被校驗對象 * @param <T> 泛型 * @return Map </T> */ fun validate(obj: Any): Map<String, String> { var errorMap: Map<String, String>? = null val set = validator.validate(obj, Default::class.java) if (CollectionUtils.isEmpty(set)) { return emptyMap() } errorMap = set.map { it.propertyPath.toString() to it.message }.toMap() return errorMap } /** * 校驗對象屬性 * @param obj 被校驗對象 * @param <T> 泛型 * @return List </T> */ fun validata(obj: Any): List<String> { val set = validator.validate(obj, Default::class.java) return if (CollectionUtils.isEmpty(set)) { emptyList() } else set.stream() .filter {Objects.nonNull(it)} .map { it.message } .toList() } }
抽象校驗方法
因為校驗是通用的,幾乎大部分接口都需要檢驗傳入參數,所以我們把校驗方法抽出來放在通用Controller層里,通用層這里不建議使用Class或者是抽象類,而是使用interface,定義如下:
@Throws(ParamException::class) fun validate(t:Any) { val errorMap = ValidatorUtils.validate(t).toMutableMap() if (errorMap.isNotEmpty()) { throw ParamException(ResultEnums.SYSTEM_ERROR.code, errorMap.toString()) } }
這里如果有參數錯誤就直接拋出參數異常,然后交給全局異常處理器來捕獲。
Controller層編寫
@PostMapping("/student") fun create(@RequestBody studentForm: StudentForm): ResultVo<StudentDTO> { this.validate(studentForm) val studentDTO = StudentDTO() BeanUtils.copyProperties(studentForm, studentDTO) return ResultVo(200, "", studentDTO) }
1.傳入一個空對象: 返回結果:
{ "status": 500, "msg": "{school=學校不能為空, id=Id不能為空, age=年齡不能為空, Interests=興趣愛好不能為空}", "data": "" }
自定義校驗規(guī)則
本篇文章開始之前我們提到過@Pattern,這個注解主要是方便我們定義自己的校驗規(guī)則,假如我這里需要校驗前端傳入的生日,是否符合我所需要的格式,如下所示:
@NotBlank(message = "生日不能為空") @Pattern(regexp="^(19|20)\\d{2}-(1[0-2]|0?[1-9])-(0?[1-9]|[1-2][0-9]|3[0-1])$", message="不是生日格式") var birthday: String = ""
這里的校驗邏輯可能不完善,大家使用的時候需要注意。
修改完成后我再次請求
請求示例
空值
入參: { "age": "10", "id": "1", "school": "學校", "interests": ["戶外運動"], "birthday": "" } 出參: { "status": 500, "msg": "{birthday=生日不能為空}", "data": "" }
錯誤參數
入參: { "age": "10", "id": "1", "school": "學校", "interests": ["戶外運動"], "birthday": "1989-20-20" } 出參: { "status": 500, "msg": "{birthday=不是生日格式}", "data": "" }
正確示例
入參: { "age": "10", "id": "1", "school": "學校", "interests": ["戶外運動"], "birthday": "1999-01-01" } 出參: { "status": 200, "msg": "", "data": { "id": "1", "birthday": "1999-01-01", "age": "10", "school": "學校" } }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“SpringBoot2.X Kotlin之數據校驗和異常處理的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!
新聞名稱:SpringBoot2.XKotlin之數據校驗和異常處理的示例分析
標題路徑:http://muchs.cn/article8/jpehip.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、全網營銷推廣、網站建設、面包屑導航、移動網站建設、微信小程序
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)