詳解Java后端優(yōu)雅驗(yàn)證參數(shù)合法性
1、首先創(chuàng)建一個(gè)測試實(shí)體類Person,并攜帶如上注解,其注解的作用描述在message
package com.clickpaas.pojo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * @author 方延杰 * @version 1.0 * @since 2020/12/10 9:04 下午 */ @Data public class Person { @Null(message = "death必須為null") private String death; @AssertTrue(message = "bool必須為true") private boolean bool; @AssertFalse(message = "fal必須為false") private boolean fal; @Min(value = 1, message = "min必須為數(shù)字,其值大于或等于指定的最小值") private Integer min; @Max(value = 10, message = "max必須為數(shù)字,其值小于或等于指定的最大值") private Integer max; @DecimalMin(value = "1", message = "minDeci最小不能小于1") private BigDecimal minDeci; @DecimalMax(value = "10", message = "maxDeci最大不能大于10") private BigDecimal maxDeci; @Size(min = 1, max = 2, message = "list集合的長度最小不能小于1,最大不能大于2") private List<Object> list; @Digits(integer = 4, fraction = 2, message = "digits整數(shù)位不能超過4個(gè),小數(shù)位不能超過2個(gè)") private BigDecimal digits; /** * 將前臺(tái)傳來的日期數(shù)據(jù)映射到此字段 */ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Past(message = "past必須為過去的日期") private Date past; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Future(message = "future必須為將來的日期") private Date future; @Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "phone必須符合正則表達(dá)式") private String phone; @Email(message = "email必須是郵箱格式") private String email; @Length(min = 1, max = 2, message = "length長度最小不能小于1,最大不能大于2") private String length; @NotEmpty(message = "id不能為null,長度大于0") private String id; @Range(min = 1, max = 12, message = "month最小不能小于1,最大不能大于12") private Integer month; @NotBlank(message = "name不能為null,字段串長度大于0(限字符串)") private String name; }
2、封裝返回響應(yīng)體
package com.clickpaas.response; import lombok.AllArgsConstructor; import lombok.Data; /** * @author 方延杰 * @version 1.0 * @since 2019/7/3 4:32 下午 */ @Data @AllArgsConstructor public class CodeMsg { private int code; private String msg; /** * 失敗 */ public static CodeMsg SERVER_ERROR = new CodeMsg(500, "服務(wù)端異常"); }
package com.clickpaas.response; import lombok.AllArgsConstructor; import lombok.Data; /** * @author 方延杰 * @version 1.0 * @since 2019/7/3 4:35 下午 */ @Data @AllArgsConstructor public class Result<T> { /** * 返回狀態(tài)碼 除200其余全部失敗 */ private int code; /** * 返回信息 除success其余全部失敗 */ private String msg; /** * 泛型數(shù)據(jù) */ private T data; /** * 成功時(shí)返回的類型 * * @param data 數(shù)據(jù) * @param <T> 泛型 * @return 泛型數(shù)據(jù) */ public static <T> Result<T> success(T data) { return new Result<>(200, "success", data); } public static <T> Result<T> fail(CodeMsg codeMsg) { return new Result<>(codeMsg); } private Result(CodeMsg codeMsg) { if (codeMsg == null) { return; } this.code = codeMsg.getCode(); this.msg = codeMsg.getMsg(); } }
3、創(chuàng)建使用增強(qiáng)器攔截并返回異常信息
package com.clickpaas.config; import com.clickpaas.response.CodeMsg; import com.clickpaas.response.Result; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * @author 方延杰 * @version 1.0 * @since 2018/12/10 4:59 下午 */ @RestControllerAdvice public class GlobalExceptionInterceptor { @ExceptionHandler(value = MethodArgumentNotValidException.class) public Result<Object> exceptionHandler(HttpServletRequest request, Exception e) { String errMsg = "處理失敗"; if (e instanceof MethodArgumentNotValidException) { // 拿到參數(shù)校驗(yàn)具體異常信息 errMsg = Objects.requireNonNull(((MethodArgumentNotValidException) e).getBindingResult().getFieldError()).getDefaultMessage(); } return Result.fail(new CodeMsg(500, errMsg)); } }
4、創(chuàng)建控制層測試
package com.clickpaas.controller; import com.clickpaas.pojo.Person; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; /** * @author 方延杰 * @version 1.0 * @since 2020/12/10 9:03 下午 */ @RestController public class ValidController { @PostMapping("/valid") public String valid(@Validated @RequestBody Person person) { return "success"; } }
5、測試符合驗(yàn)證請求體訪問,請求體如下:
{ "death":null, "bool":true, "fal":false, "min":1, "max":10, "minDeci":1, "maxDeci":10, "list":[ {},{} ], "digits":1144.12, "past":"2020-10-01 10:00:00", "future":"2022-10-01 10:00:00", "phone":"15900445584", "email":"yanjie.fang@clickpaas.com", "length":"ab", "id":" ", "name":"a" }
6、故意修改不符合驗(yàn)證的數(shù)據(jù)
7、如果想做整體驗(yàn)證,如下:
package com.clickpaas.uitl; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * Bean整體校驗(yàn)工具類 * * @author 方延杰 * @version 1.0 * @since 2020/12/10 10:08 下午 */ public class ValidatorUtils { private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator(); /** * Bean整體校驗(yàn),有不合規(guī)范,拼接message */ public static String validate(Object obj, Class<?>... groups) { StringBuilder errorMessage = new StringBuilder(); Set<ConstraintViolation<Object>> resultSet = VALIDATOR.validate(obj, groups); if (resultSet.size() > 0) { //如果存在錯(cuò)誤結(jié)果,則將其解析并進(jìn)行拼湊后異常拋出 List<String> errorMessageList = resultSet.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()); errorMessageList.forEach(o -> errorMessage.append(o).append(";")); } return errorMessage.toString(); } }
8、整體測試類
到此這篇關(guān)于詳解Java后端優(yōu)雅驗(yàn)證參數(shù)合法性的文章就介紹到這了,更多相關(guān)Java 驗(yàn)證參數(shù)合法性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java 后端生成pdf模板合并單元格表格的案例
- Java后端面試題最新整理
- Java后端Cookie實(shí)現(xiàn)(時(shí)間戳)代碼實(shí)例
- 微信小程序獲取手機(jī)號(hào),后端JAVA解密流程代碼
- 微信小程序后端(java)開發(fā)流程的詳細(xì)步驟
- 關(guān)于java后端的詳解
- Java后端產(chǎn)生驗(yàn)證碼后臺(tái)驗(yàn)證功能的實(shí)現(xiàn)代碼
- 一個(gè)Java程序猿眼中的前后端分離以及Vue.js入門(推薦)
- 詳解使用IntelliJ IDEA新建Java Web后端resfulAPI模板
- Java后端WebSocket的Tomcat實(shí)現(xiàn)
- JAVA后端應(yīng)該學(xué)什么技術(shù)
相關(guān)文章
詳解spring cloud中使用Ribbon實(shí)現(xiàn)客戶端的軟負(fù)載均衡
這篇文章主要介紹了詳解spring cloud中使用Ribbon實(shí)現(xiàn)客戶端的軟負(fù)載均衡,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01Java后端返回PDF預(yù)覽給前端的實(shí)現(xiàn)
前端要預(yù)覽服務(wù)器PDF 可直接將要blob流返回給前端,即可用瀏覽器自帶pdf預(yù)覽功能打開,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下2023-09-09Java游戲服務(wù)器之?dāng)?shù)據(jù)庫表存取封裝
這篇文章主要介紹了Java游戲服務(wù)器之?dāng)?shù)據(jù)庫表存取封裝的相關(guān)資料,需要的朋友可以參考下2015-11-11SpringSecurity?用戶帳號(hào)已被鎖定的問題及解決方法
這篇文章主要介紹了SpringSecurity?用戶帳號(hào)已被鎖定,本文給大家分享問題原因及解決方式,需要的朋友可以參考下2023-12-12配置hadoop環(huán)境mapreduce連接不上hdfs解決
這篇文章主要為大家介紹了配置hadoop環(huán)境mapreduce連接不上hdfs解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10