您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何實現(xiàn)spring validation多層對象校驗”,在日常操作中,相信很多人在如何實現(xiàn)spring validation多層對象校驗問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何實現(xiàn)spring validation多層對象校驗”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
spring validation多層對象校驗
1、第一層對象定義
2、第二層對象
3、Controller層校驗使用
validation校驗對象多個字段返回的消息內(nèi)容順序隨機問題
問題描述
解決辦法
import java.io.Serializable; import javax.validation.Valid; /** * 請求參數(shù) * @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; /** * 職務(wù) */ @NotBlank(message = "請輸入職務(wù)", groups = UserGroup.ADD.class) private String position; }
定義的分組接口如下
public interface UserGroup { interface ADD { } interface UPDATE { } }
在使用Spring的@Validated注解對對象中的多個參數(shù)進行校驗時,在MethodArgumentNotValidException異常攔截器處發(fā)現(xiàn)如果有多個條件不符和校驗規(guī)則的參數(shù),MethodArgumentNotValidException中的bindingResult.getAllErrors()異常消息集合中的數(shù)據(jù)是按照隨機順序返回的,按照正常邏輯來說,我們肯定是想要按順序?qū)⒌谝粋€不符合規(guī)范字段錯誤信息返回給用戶。
經(jīng)過一番搜索發(fā)現(xiàn)可以給類上每個驗證的注解都指定不同的group,然后在創(chuàng)建一個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; /** * 職務(wù) */ @NotBlank(message = "請輸入職務(wù)", groups = UserGroup.ADD.POSITION.class) private String position; }
在@GroupSequence注解中指定設(shè)置的接口數(shù)組順序,然后在參數(shù)進行校驗的時候直接在@Validated注解中放入UserGroup.ADD.class這個接口類即可public Result add(@Validated(UserGroup.ADD.class) @RequestBody User user),validation就會按照順序返回錯誤信息,在異常攔截器中直接這樣取出第一個錯誤信息即可MethodArgumentNotValidException.getBindingResult().getAllErrors().get(0).getDefaultMessage()
到此,關(guān)于“如何實現(xiàn)spring validation多層對象校驗”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。