一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - springboot 傳參校驗@Valid及對其的異常捕獲方式

springboot 傳參校驗@Valid及對其的異常捕獲方式

2022-02-23 00:43這可真叫人頭禿 Java教程

這篇文章主要介紹了springboot 傳參校驗@Valid及對其的異常捕獲方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

傳參校驗@Valid及對其的異常捕獲

springboot參數(shù)經(jīng)常需要進行校驗,比如創(chuàng)建文件,文件名就需要進行一定的校驗。

本文以創(chuàng)建文件夾為例進行參數(shù)校驗:controller:

首先就是在需要校驗的參數(shù)類前面添加注釋@Valid

?
1
2
3
4
5
6
7
8
9
@ApiOperation(value = "創(chuàng)建目錄", notes = "在某目錄下創(chuàng)建新文件夾")
    @ApiResponses({
            @ApiResponse(code = 500, response = RestCodeMsg.class, message = "錯誤")
    })
    @PostMapping(value = "api/scene/createdir")
    public ResponseEntity<Map> createNewOrEditFile(@RequestBody @Valid ixviewVo ixveVo) {
     ....
     //校驗與內(nèi)容無關(guān)
    }

其次對參數(shù)類進行校驗設(shè)置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Data
@ApiModel
@Getter
@Setter
@NoArgsConstructor
public class ixviewVo {
    @ApiModelProperty("是否文件夾")
    private boolean dir;
    @NotBlank(message="目錄名稱不能為空")
    @Pattern(regexp="[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$",message="目錄名稱不符合標準")
    @ApiModelProperty("目錄名稱")
    private String dirname;
    @ApiModelProperty("上級目錄ID")
    private Long parentId;
}

其中[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$為文件名稱校驗的正則表達式,復(fù)制進代碼記得去掉自動生成的\。

到此,對參數(shù)校驗的全部設(shè)置完成。當(dāng)參數(shù)不符合校驗則會拋出異常,接下來就是對拋出的異常進行捕獲:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@RestControllerAdvice
public class BadRequestExceptionHandler {
    private static final Logger logger = LoggerFactory.getLogger(BadRequestExceptionHandler.class);
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity validationBodyException(MethodArgumentNotValidException exception){
        BindingResult result = exception.getBindingResult();
        if (result.hasErrors()) {
            List<ObjectError> errors = result.getAllErrors();
            errors.forEach(p ->{
                FieldError fieldError = (FieldError) p;
                logger.error("Data check failure : object{"+fieldError.getObjectName()+"},field{"+fieldError.getField()+
                        "},errorMessage{"+fieldError.getDefaultMessage()+"}");
            });
        }
        return ResponseEntity.ok(getPublicBackValue(false, "目錄名稱不符合標準"));
    }
    public Map<String, Object> getPublicBackValue(boolean flag, String message) {
        Map<String, Object> map = new HashMap<String, Object>();
        if (flag) {
            map.put("result_code", 0);
        } else {
            map.put("result_code", 1);
        }
        map.put("result_reason", message);
        return map;
    }
}

@Valid校驗異常捕捉

?
1
2
3
4
5
@Api(tags = {"參數(shù)管理"})
@Validated
@RestController
@RequestMapping("/module/param")
public class TbModuleParamController {}
?
1
2
3
4
5
6
7
8
9
10
public ResponseDTO getModuleParam(@PathVariable(name = "moduleId") @Valid @NotNull @Max(value = 13) @Min(value = 1) Integer moduleId) {
    QueryWrapper<TbModuleParam> paramQueryWrapper = new QueryWrapper<>();
    paramQueryWrapper.eq("module_id", moduleId).eq("state", 1);
    TbModuleParam moduleParam = moduleParamService.getOne(paramQueryWrapper);
    List<QueryParamVo> queryParamVoList = new ArrayList<>();
    if (moduleParam != null) {
        queryParamVoList = JSONArray.parseArray(moduleParam.getModuleJson(), QueryParamVo.class);
    }
    return ResponseDTO.defaultResponse(queryParamVoList);
}
?
1
2
3
4
5
@PostMapping(value = "/save", produces = WebServiceCommonConstant.PRODUCES_JSON)
public ResponseDTO<Boolean> addDict(@RequestBody @Validated LandInfoBasicVo saveVo) {
    boolean result = landInfoService.saveInfo(saveVo);
    return ResponseDTO.defaultResponse("保存成功");
}
?
1
2
3
@NotBlank(message = "土地名稱不能為空")
@Size(max = 1)
private String landName;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@ControllerAdvice
public class ExceptionHandle {
    private static final Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
    public static List<String> msgList = new ArrayList<>();
 
    /**
     * 異常處理
     *
     * @param e 異常信息
     * @return 返回類是我自定義的接口返回類,參數(shù)是返回碼和返回結(jié)果,異常的返回結(jié)果為空字符串
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseDTO handle(Exception e) {
        //自定義異常返回對應(yīng)編碼
        if (e instanceof PermissionException) {
            PermissionException ex = (PermissionException) e;
            return ResponseDTO.customErrorResponse(ex.getCode(), ex.getMessage());
        }
        //其他異常報對應(yīng)的信息
        else {
            logger.info("[系統(tǒng)異常]{}", e.getMessage(), e);
            msgList.clear();
            msgList.add(e.toString());
            StackTraceElement[] stackTrace = e.getStackTrace();
            for (StackTraceElement element : stackTrace) {
                msgList.add(element.getClassName() + ":" + element.getMethodName() + "," + element.getLineNumber());
            }
            return ResponseDTO.customErrorResponse(-1, "系統(tǒng)內(nèi)部錯誤");
        }
    }
 
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseDTO handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        List<String> message = new ArrayList<>();
        if (ex.getBindingResult() != null) {
            for (FieldError item : ex.getBindingResult().getFieldErrors()) {
                String itemMessage = item.getDefaultMessage();
                message.add(itemMessage);
            }
        }
        return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]",""));
    }
 
    @ExceptionHandler(value = ConstraintViolationException.class)
    @ResponseBody
    public ResponseDTO handleConstraintViolationException(ConstraintViolationException ex) {
        List<String> message = new ArrayList<>();
        Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();
        if (!CollectionUtils.isEmpty(constraintViolations)) {
            constraintViolations.forEach(v -> message.add(v.getMessage()));
        }
        return ResponseDTO.customErrorResponse(-1, message.toString().replace("[","").replace("]",""));
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://allyixi.blog.csdn.net/article/details/100706810

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品欧美亚洲韩国日本99 | 免费超级乱淫播放手机版 | 九九精品视频在线免费观看 | 高清欧美不卡一区二区三区 | 91原创国产 | 精品视频 九九九 | 黄色aaa级片| 出轨同学会免费观看 | 国产福利一区二区三区 | 亚洲美日韩| 末代皇帝无删减版在线观看 | 91精品国产在线 | 久草在线精彩免费视频 | 国产精品一二区 | 亚洲 小说 欧美 激情 另类 | 爱爱调教| 精品手机在线视频 | 亚洲成人一区在线 | 精品一二三区久久AAA片 | 国产haodiaose最新 | 欧美丝袜videohd | 国产免费不卡视频 | 日韩精品成人 | 午夜精品久久久内射近拍高清 | 日本老妇和子乱视频 | 欧美一区二区三区成人看不卡 | 国产suv精品一区二区四区三区 | 污污的动态图合集 | chinese国产打屁股 | 99热久久这里只精品国产www | 国内久久 | 久久精品小视频 | 国产99青草全福视在线 | 娇妻与老头绿文小说系列 | 人体做爰aaaa免费 | 免费370理论片中文字幕 | 久久精品国产在热亚洲完整版 | 亚洲国产成人久久77 | 操bb| 国产精品成人扳一级aa毛片 | 1024免费观看完整版在线播放 |