您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何實現spring validation多層對象校驗”,在日常操作中,相信很多人在如何實現spring validation多層對象校驗問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何實現spring validation多層對象校驗”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
spring validation多層對象校驗
1、第一層對象定義
2、第二層對象
3、Controller層校驗使用
validation校驗對象多個字段返回的消息內容順序隨機問題
問題描述
解決辦法
import java.io.Serializable; import javax.validation.Valid; /** * 請求參數 * @Title: ReqIn.java * @Package com.spring.pro.model * @Description: * @author ybwei * @date 2018年9月18日 下午1:43:26 * @version V1.0 */ public class ReqIn<T> implements Serializable{ private static final long serialVersionUID = 25549320423002325L; /** * 請求頭信息 */ private String head; /** * 請求主體信息 */ @Valid private T data; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
import java.io.Serializable; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @Title: User.java * @Package com.spring.pro.model * @Description: * @author ybwei * @date 2018年9月18日 下午1:46:15 * @version V1.0 */ public class User implements Serializable{ private static final long serialVersionUID = 6747944028911495569L; private String id; @NotBlank private String name; @NotNull private Integer age; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
import javax.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; import com.spring.pro.model.ReqIn; import com.spring.pro.model.User; /** * @Title: UserController.java * @Package com.spring.pro.controller * @Description: * @author ybwei * @date 2018年9月18日 下午1:48:14 * @version V1.0 */ @RestController public class UserController { private Logger logger=LoggerFactory.getLogger(getClass()); /** * 校驗 * @param reqIn * @return * @author ybwei */ @PostMapping("/valid") public HttpStatus valid(@Valid @RequestBody ReqIn<User> reqIn){ logger.info("reqIn:{}",JSON.toJSONString(reqIn)); return HttpStatus.OK; } }
model中的代碼如下
public class User { @NotNull(message = "id不能為空", groups = UserGroup.UPDATE.class) protected Integer id; /** * 姓名 */ @NotBlank(message = "請輸入姓名", groups = UserGroup.ADD.class) private String name; /** * 性別 */ @NotBlank(message = "請輸入性別", groups = UserGroup.ADD.class) private String sex; /** * 手機號 */ @NotBlank(message = "請輸入手機號", groups = UserGroup.ADD.class) private String phone; /** * 郵箱 */ @NotBlank(message = "請輸入郵箱", groups = UserGroup.ADD.class) private String email; /** * 公司名 */ @NotBlank(message = "請輸入公司名", groups = UserGroup.ADD.class) private String companyName; /** * 職務 */ @NotBlank(message = "請輸入職務", groups = UserGroup.ADD.class) private String position; }
定義的分組接口如下
public interface UserGroup { interface ADD { } interface UPDATE { } }
在使用Spring的@Validated注解對對象中的多個參數進行校驗時,在MethodArgumentNotValidException異常攔截器處發現如果有多個條件不符和校驗規則的參數,MethodArgumentNotValidException中的bindingResult.getAllErrors()異常消息集合中的數據是按照隨機順序返回的,按照正常邏輯來說,我們肯定是想要按順序將第一個不符合規范字段錯誤信息返回給用戶。
經過一番搜索發現可以給類上每個驗證的注解都指定不同的group,然后在創建一個interface接口添加@GroupSequence對加在字段上的那些接口進行匯總,如下:
public interface UserGroup { @GroupSequence({ADD.NAME.class, ADD.SEX.class, ADD.PHONE.class, ADD.EMAIL.class, ADD.COMPANY_NAME.class, ADD.POSITION.class}) interface ADD { interface NAME {} interface SEX {} interface PHONE {} interface EMAIL {} interface COMPANY_NAME {} interface POSITION {} } interface UPDATE { } }
Model
@NoArgsConstructor public class User { @NotNull(message = "id不能為空", groups = UserGroup.UPDATE.class) protected Integer id; /** * 姓名 */ @NotBlank(message = "請輸入姓名", groups = UserGroup.ADD.NAME.class) private String name; /** * 性別 1.男 2.女 3.未知 */ @NotBlank(message = "請輸入性別", groups = UserGroup.ADD.SEX.class) private String sex; /** * 手機號 */ @NotBlank(message = "請輸入手機號", groups = UserGroup.ADD.PHONE.class) private String phone; /** * 郵箱 */ @NotBlank(message = "請輸入郵箱", groups = UserGroup.ADD.EMAIL.class) private String email; /** * 公司名 */ @NotBlank(message = "請輸入公司名", groups = UserGroup.ADD.COMPANY_NAME.class) private String companyName; /** * 職務 */ @NotBlank(message = "請輸入職務", groups = UserGroup.ADD.POSITION.class) private String position; }
在@GroupSequence注解中指定設置的接口數組順序,然后在參數進行校驗的時候直接在@Validated注解中放入UserGroup.ADD.class這個接口類即可public Result add(@Validated(UserGroup.ADD.class) @RequestBody User user),validation就會按照順序返回錯誤信息,在異常攔截器中直接這樣取出第一個錯誤信息即可MethodArgumentNotValidException.getBindingResult().getAllErrors().get(0).getDefaultMessage()
到此,關于“如何實現spring validation多層對象校驗”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。