<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料的校驗是互動式網站一個不可或缺的功能,前端的js校驗可以涵蓋大部分的校驗職責,如使用者名稱唯一性,生日格式,郵箱格式校驗等等常用的校驗。但是為了避免使用者繞過瀏覽器,使用http工具直接向後端請求一些違法資料,伺服器端的資料校驗也是必要的,可以防止髒資料落到資料庫中,如果資料庫中出現一個非法的郵箱格式,也會讓運維人員頭疼不已。可以使用本文將要介紹的validation來對資料進行校驗。
1.JSR303/JSR-349: JSR303是一項標準,只提供規範不提供實現,規定一些校驗規範即校驗註解,如@Null,@NotNull,@Pattern,位於javax.validation.constraints包下。JSR-349是其的升級版本,新增了一些新特性。
2.hibernate validation:hibernate validation是對這個規範的實現,並增加了一些其他校驗註解,如@Email,@Length,@Range等等
3.spring validation:spring validation對hibernate validation進行了二次封裝,在springmvc模組中新增了自動校驗,並將校驗資訊封裝進了特定的類中
spring-web模組使用了hibernate-validation,並且databind模組也提供了相應的資料繫結功能。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
我們只需要引入spring-boot-starter-web依賴即可,如果檢視其子依賴,可以發現如下的依賴:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency>
@SpringBootApplication public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); System.out.println("Start app success."); } }
public class Person { @NotEmpty(message = "name不能為空") private String name; @Range(min = 0, max = 100, message = "age不能大於100小於0") private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
springmvc為我們提供了自動封裝表單引數的功能,一個新增了引數校驗的典型controller如下所示。
@RequestMapping("/test") public String valid(@Validated Person person, BindingResult bindingResult) { if (bindingResult.hasErrors()) { for (FieldError fieldError : bindingResult.getFieldErrors()) { System.out.println(fieldError); } return "fail"; } return "success"; }
值得注意的地方:
一個最基本的校驗就完成了.
啟動容器測試結果如下:
Field error in object 'person' on field 'age': rejected value [105]; codes [Range.person.age,Range.age,Range.int,Range]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.age,age]; arguments []; default message [age],100,0]; default message [age不能大於100小於0]
前面那種方式處理校驗錯誤,略顯複雜,而且一般網站都會對請求錯誤做統一的404頁面封裝,如果資料校驗不通過,則Spring boot會丟擲BindException異常,我們可以捕獲這個異常並使用Result封裝返回結果。通過@RestControllerAdvice定義異常捕獲類。
Controller類:
@RequestMapping(value = "valid", method = RequestMethod.GET) public String valid(@Validated Person person) { System.out.println(person); return "success"; }
統一例外處理類:
@RestControllerAdvice public class BindExceptionHanlder { @ExceptionHandler(BindException.class) public String handleBindException(HttpServletRequest request, BindException exception) { List<FieldError> allErrors = exception.getFieldErrors(); StringBuilder sb = new StringBuilder(); for (FieldError errorMessage : allErrors) { sb.append(errorMessage.getField()).append(": ").append(errorMessage.getDefaultMessage()).append(", "); } System.out.println(sb.toString()); return sb.toString(); } }
測試: http://localhost:8080/valid?age=105&name=steven
輸出:age: age不能大於100小於0,
@Documented @Constraint(validatedBy = NameValidationValidator.class) @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RUNTIME) public @interface NameValidation { String message() default "不是合法的名字"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; @Target({PARAMETER, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { NameValidation[] value(); } }
public class NameValidationValidator implements ConstraintValidator<NameValidation, String> { @Override public boolean isValid(String value, ConstraintValidatorContext context) { if ("steven".equalsIgnoreCase(value)) { return true; } String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate(); System.out.println("default message :" + defaultConstraintMessageTemplate); //禁用預設提示資訊 //context.disableDefaultConstraintViolation(); //設定提示語 //context.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation(); return false; } }
@NotEmpty(message = "name不能為空") @NameValidation private String name;
測試: http://localhost:8080/valid?age=105&name=lxy
輸出:age: age不能大於100小於0, name: 不是合法的名字,
通過上面的例子可以看出,其實使用很簡單,但是有沒有注意到一個問題,錯誤資訊沒有實現國際化。hibernate-validator國際化還是比較繁瑣的,包含:
以上就是SpringBoot利用validation實現優雅的校驗引數的詳細內容,更多關於SpringBoot validation校驗引數的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45