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,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檔案
檔案中新增需要列印的訊息,如:
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)); }
測試呼叫和返回結果,返回的資料和預期相符合
三、國際化引數校驗
根據上面的修改
1、bean 中新增標籤
標籤需要加在屬性上,@NotEmpty標籤String的引數不能為空
@Data public class DemoDto { @NotEmpty(message = "{demo.key.null}") @Length(min = 5,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
}
參考文章:
spring boot國際化——MessageSource的使用
總結
到此這篇關於SpringBoot引數校驗與國際化使用教程的文章就介紹到這了,更多相關SpringBoot引數校驗與國際化使用內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!