springboot使用@Validated或@Valid注解校驗參數方式
使用@Validated注解校驗參數
使用@Validated注解 校驗參數是非常簡潔和省代碼,減少工作量的一種很好用的方式,自用這個注解之前呢,我以前一直用的if判斷,這種方式非常麻煩,而且工作量大大加大了。
注解地方
@Validated
:可以用在類、方法和方法參數上。
@Valid
:可以用在方法、構造函數、方法參數和成員屬性(字段)上
嵌套驗證
- 嵌套驗證就是類嵌套類的驗證,比如我要在集合上加一個@notnull的注解,要求該集合中的每一個對象都被驗證,如果只用@Validated與@Valid是不會驗證的。
- 我們要用@Validated配合@Valid來進行驗證。
使用@Validated 注解,先在pom文件中加入依賴
<!-- 校驗入參 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
使用示例
常用注解
下面的表格列出常用校驗類及主要功能。
這些注解必須配合@Valid或@Validated使用,通過這兩個注解開啟校驗。
注 :對于長度的校驗基本都支持字符串、集合、Map、數組的長度。
下面是@Valid和@Validated的區(qū)別。
注 :嵌套驗證。
JavaBean a中某個屬性類型是JavaBean b,對a進行驗證的同時驗證b。
代碼示例
在實體類當中定義需要校驗的屬性參數
@Table @Entity(name = "person") // 這是一個標記注釋,表明這個類是一個實體。這個注釋必須放在類名稱上。 @JsonIgnoreProperties(value = "hibernateLazyInitializer") public class Student implements Serializable { @Id // 此注釋位于持有持久標識屬性的特定字段上。該字段被視為數據庫中的主鍵。 @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; //后端設置名字限制 // @Column標記表示所持久化屬性所映射表中的字段 // unique屬性表示該字段是否為唯一標識 // nullable屬性表示該字段是否可以為null值 @Column(unique = true, nullable = false) @NotBlank(message = "名字不為空") @Length(message = "名字長度在1-10之間", min = 1, max = 10) private String name; //后端設置性別限制 private int sex; @NotBlank(message = "電話不能為空") @Length(message = "電話號碼長度為4-8", min = 4, max = 11) private String telephone; @NotBlank(message = "身份證不能為空") @Length(message = "電話號碼長度為17-18", min = 17, max = 18) private String card; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday;
在Controller控制器中校驗接收參數
// 添加——接收添加的數據 @PostMapping("/doAdd") @ResponseBody public HttpResult doAdd(@Valid Student student){ serviceStudent.doCreate(student); return HttpResult.success(); }
在postman當中模擬請求校驗
{ "timestamp": "2020-12-20T08:02:27.935+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "NotBlank.student.telephone", "NotBlank.telephone", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "student.telephone", "telephone" ], "arguments": null, "defaultMessage": "telephone", "code": "telephone" } ], "defaultMessage": "電話不能為空", "objectName": "student", "field": "telephone", "rejectedValue": null, "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "NotBlank.student.card", "NotBlank.card", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "student.card", "card" ], "arguments": null, "defaultMessage": "card", "code": "card" } ], "defaultMessage": "身份證不能為空", "objectName": "student", "field": "card", "rejectedValue": null, "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "NotBlank.student.name", "NotBlank.name", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "student.name", "name" ], "arguments": null, "defaultMessage": "name", "code": "name" } ], "defaultMessage": "名字不為空", "objectName": "student", "field": "name", "rejectedValue": null, "bindingFailure": false, "code": "NotBlank" } ], "message": "Validation failed for object='student'. Error count: 3", "trace": "org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 3 errors\nField error in object 'student' on field 'telephone': rejected value [null]; codes [NotBlank.student.telephone,NotBlank.telephone,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [student.telephone,telephone]; arguments []; default message [telephone]]; default message [電話不能為空]\nField error in object 'student' on field 'card': rejected value [null]; codes [NotBlank.student.card,NotBlank.card,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [student.card,card]; arguments []; default message [card]]; default message [身份證不能為空]\nField error in object 'student' on field 'name': rejected value [null]; codes [NotBlank.student.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [student.name,name]; arguments []; default message [name]]; default message [名字不為空]\r\n\tat org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:164)\r\n\tat org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:660)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:741)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\r\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.lang.Thread.run(Thread.java:748)\r\n", "path": "/student/doAdd" }
這說明我們的校驗已經可以使用了~
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。