驗證參數對我接觸過的框架來說就struts2有自帶參數驗證,對於springmvc來說以前的項目只能一個個來驗證
接下來分享一下springmvc怎么驗證參數,讓前端調用接口的時候能能很清楚的了解有那個值沒傳
這里要擁戴hibernate的一個jar
<!-- 參數驗證 --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.0.Final</version> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>el-api</artifactId> <version>2.2</version> </dependency>
在創建一個實體的驗證類(這里我用的是登陸需要賬號密碼)
package com.yuanxinbuluo.service.user.valid; import java.io.Serializable; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.groups.Default; import com.yuanxinbuluo.util.valid.group.GroupB; /** * 用戶驗證實體*/ public class UserValid implements Serializable{ private static final long serialVersionUID = 4615558843543647320L; /** * 用戶名稱 */ @NotNull(message="用戶名不能為空") private String userNm;/** * 用戶密碼 */ @Size(min=6 ,max= 20 ,message = "密碼長度不符合標准") private String userPwd; public String getUserNm() { return userNm; } public void setUserNm(String userNm) { if(!userNm.trim().equals("")){ this.userNm = userNm; } }public String getUserPwd() { return userPwd; } public void setUserPwd(String userPwd) { this.userPwd = userPwd; } }
接下來在控制器用對象封裝傳過來的值
@ResponseBody @RequestMapping(value = "/login", method = RequestMethod.POST) public Map<String, Object> login(@Validated UserValid user, BindingResult result){ /** * 驗證 */ if(result.hasErrors()){ List<FieldError> error = result.getFieldErrors(); String msg = error.get(0).getDefaultMessage(); return super.result(RequestHttpCode.SC_BAD_REQUEST, msg); }
--業務-- }
好了,user這個類是剛剛創建的驗證參數的驗證實體類,BindingResult 是一個驗證,如果傳過來的值不符合剛剛在實體類的注解時,調用方法
hasErrors() 如果有錯誤返回true否則false 后面代碼只是獲取錯誤定義返回message
這時候調試的時候,獲取的message是無序的,怎么能做到有序呢,
創建幾個類
package com.yuanxinbuluo.util.valid.group; import javax.validation.GroupSequence; import javax.validation.groups.Default; /** * 驗證順序接口*/ @GroupSequence( { Default.class, GroupA.class, GroupB.class }) public interface Group { }
package com.yuanxinbuluo.util.valid.group; /** * 驗證順序接口*/ public interface GroupA { }
package com.yuanxinbuluo.util.valid.group; /** * 驗證順序接口*/ public interface GroupB { }
這是在把user這個類添加group
/** * 用戶號碼 */
@NotNull(message="用戶名不能為空", groups = Default.class)
private String userNm;
/** * 用戶密碼 */ @Size(min=6 ,max= 20 ,message = "密碼長度不符合標准", groups = GroupA.class) private String userPwd;
@ResponseBody @RequestMapping(value = "/login", method = RequestMethod.POST) public Map<String, Object> login(@Validated(Group.class) UserValid user, BindingResult result){ }
這個時候他會去先去檢驗用戶名在密碼,當一個驗證實體類的屬性,有幾個屬性是一個接口驗證,另外幾個屬性是另外一個接口驗證,
這種情況也可以用上面去分組
groups 是可以有多個
