中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何校驗SpringBoot的參數

發布時間:2020-11-25 15:24:09 來源:億速云 閱讀:267 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關如何校驗SpringBoot的參數,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

一、參數校驗

springboot 使用校驗框架validation校驗方法的入參

SpringBoot的Web組件內部集成了hibernate-validator,所以我們這里并不需要額外的為驗證再導入其他的包。

1、bean 中添加標簽

標簽需要加在屬性上,@NotEmpty標簽String的參數不能為空

@Data
public class DemoDto {

 @NotEmpty(message = "名稱不能為空")
 private String name;

 @Length(min = 5, max = 25, message = "key的長度為5-25")
 private String key;

 @Pattern(regexp = "[012]", message = "無效的狀態標志")
 private String state;

}

2、Controller中開啟驗證

在Controller 中 請求參數上添加@Validated 標簽開啟驗證

 @RequestMapping("test")
 public String test(@Valid @RequestBody DemoDto dto){
 System.out.println("test....................");
 return "test.........................";
 }

測試返回結果

{
    "timestamp": "2020-01-14 13:30:03",
    "status": 400,
    "error": "Bad Request",
    "errors": [
        {
            "codes": [
                "Length.demoDto.key",
                "Length.key",
                "Length.java.lang.String",
                "Length"
            ],
            "arguments": [
                {
                    "codes": [
                        "demoDto.key",
                        "key"
                    ],
                    "arguments": null,
                    "defaultMessage": "key",
                    "code": "key"
                },
                25,
                5
            ],
            "defaultMessage": "key的長度為5-25",
            "objectName": "demoDto",
            "field": "key",
            "rejectedValue": "11",
            "bindingFailure": false,
            "code": "Length"
        },
        {...},
        {...}
    ],
    "message": "Validation failed for object='demoDto'. Error count: 3",
    "path": "/test"
}

返回的錯誤信息比較亂,需要統一整理,這個時候可以使用全局異常處理的方法

3、異常處理,捕獲錯誤信息

當驗證不通過時會拋異常出來。在異常處理器中捕獲異常信息(因為驗證不通過的項可能是多個所以統一捕獲處理),并拋給前端。(此處是前后端分離開發)

@RequestMapping("test")
 public ResultBean test(@Valid @RequestBody DemoDto dto){
 System.out.println("test....................");
 return new ResultBean("test.........................");
 }

這里統一返回一個自定義的ResultBean類型

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {


 @ExceptionHandler(value = MethodArgumentNotValidException.class)
 public ResultBean methodArgumentNotValid(HttpServletRequest req, MethodArgumentNotValidException ex) {
 ResultBean result = ResultBean.FAIL;
 List<ObjectError> errors =ex.getBindingResult().getAllErrors();
 StringBuffer errorMsg=new StringBuffer();
 errors.stream().forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
 log.error("---MethodArgumentNotValidException Handler--- ERROR: {}", errorMsg.toString());
 result.setMsg(errorMsg.toString());
 return result;
 }
}

此時的返回結果為:

{
    "code": 500,
    "msg": "無效的狀態標志;key的長度為5-25;名稱不能為空;",
    "content": null
}

二、分組校驗

有時候需要在不同的方法中對同一個bean中的參數進行校驗

1、在dto中添加groups

@Data
public class DemoDto {
 public interface Default {
 }
 public interface Update {
 }
 @NotEmpty(message = "名稱不能為空")
 private String name;
 @Length(min = 5, max = 25, message = "key的長度為5-25" ,groups = Default.class )
 private String key;
 @Pattern(regexp = "[012]", message = "無效的狀態標志",groups = {Default.class,Update.class} )
 private String state;
}

2、在controller中需要用到@Validated來校驗

@RequestMapping("test2")
 public String test2(@Validated(value = DemoDto.Default.class) @RequestBody DemoDto dto){
 System.out.println("test....................");
 return "test.........................";
 }

 @RequestMapping("test4")
 public String test4(@Validated(value = {DemoDto.Default.class,DemoDto.Update.class}) @RequestBody DemoDto dto){
 System.out.println("test....................");
 return "test.........................";
 }

三、國際化返回配置文件的信息

1. 在Resource下添加properties文件

如何校驗SpringBoot的參數

文件中添加需要打印的消息,如:

demo.key.null=demo的key不能為空
start.ge.end = 開始日期{0}必須小于結束日期{1}!
demo.key.length=demo的key長度不正確

2. 在application.yml中添加配置

spring:
 messages:
 encoding: UTF-8
 basename: message/messages_zh

3. 使用方法

在類中直接注入,即可使用

 @Autowired
 private MessageSource messageSource;

 @RequestMapping("getMessageByKey")
 public ResultBean getMessageByKey(@Valid @RequestBody DemoDto dto){
 String key = dto.getKey();
 String [] param = {"2019-8-8", "2019-9-9"};
 return new ResultBean(messageSource.getMessage(key, param, Locale.CHINA));
 }

測試調用和返回結果,返回的數據和預期相符合

如何校驗SpringBoot的參數

三、國際化參數校驗

根據上面的修改

1、bean 中添加標簽

標簽需要加在屬性上,@NotEmpty標簽String的參數不能為空

@Data
public class DemoDto {

 @NotEmpty(message = "{demo.key.null}")
 @Length(min = 5, max = 25, message = "{demo.key.length}")
 private String key;
}

2、添加上ValidationMessages文件

國際化配置文件必須放在classpath的根目錄下,即src/java/resources的根目錄下。

國際化配置文件必須以ValidationMessages開頭,比如ValidationMessages.properties 或者 ValidationMessages_en.properties。

在/resources的根目錄下添加上ValidationMessages.properties文件

demo.key.null=demo的key不能為空,這里是validationMessage
demo.key.length=demo的key長度不正確

3、返回結果

{
    "code": 500,
    "msg": "demo的key不能為空,這里是validationMessage;",
    "content": null
}

自定義properties文件

SpringBoot 國際化驗證 @Validated 的 message 國際化資源文件默認必須放在 resources/ValidationMessages.properties 中。

現在我想把資源文件放到 resources/message/messages_zh.properties 中

若要自定義文件位置或名稱則需要重寫WebMvcConfigurerAdapter 的 getValidator 方法,但WebMvcConfigurerAdapter在springboot2中已經廢棄了,可以改為使用WebMvcConfigurationSupport

在一的基礎上修改:

@Configuration
public class ValidatorConfiguration extends WebMvcConfigurationSupport {
 @Autowired
 private MessageSource messageSource;

 @Override
 public Validator getValidator() {
  return validator();
 }

 @Bean
 public Validator validator() {
  LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
  validator.setValidationMessageSource(messageSource);
  return validator;
 }
}

最后得到結果為:

{
    "code": 500,
    "msg": "demo的key不能為空ID:{0};",
    "content": null
}

關于如何校驗SpringBoot的參數就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

牟定县| 万山特区| 综艺| 文成县| 石狮市| 台州市| 抚宁县| 汉源县| 哈密市| 衡南县| 天峻县| 彭泽县| 林芝县| 马边| 邳州市| 宜宾市| 秦安县| 周宁县| 禹城市| 遵义县| 宜川县| 炉霍县| 黔江区| 渑池县| 东平县| 阳城县| 通江县| 中牟县| 兰西县| 大兴区| 陆良县| 泗阳县| 镇巴县| 尚志市| 麦盖提县| 新田县| 昌平区| 钟祥市| 行唐县| 寿宁县| 辰溪县|