中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springmvc項目使用@Valid+BindingResult遇到的問題怎么解決

發布時間:2021-12-02 15:42:51 來源:億速云 閱讀:213 作者:iii 欄目:開發技術

本篇內容介紹了“springmvc項目使用@Valid+BindingResult遇到的問題怎么解決”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    第一步:pom.xml中引入

    javax.validation和hibernate-validator

    <!-- springmvc的參數valid校驗依賴 開始 -->
    		<dependency>
    			<groupId>javax.validation</groupId>
    			<artifactId>validation-api</artifactId>
    			<version>2.0.1.Final</version>
    		</dependency>
    		<dependency>
    			<groupId>org.hibernate</groupId>
    			<artifactId>hibernate-validator</artifactId>
    			<version>6.0.16.Final</version>
    		</dependency>
    <!-- springmvc的參數valid校驗依賴 結束 -->

    之前我只引入了javax的驗證,這樣做系統不會報錯。就是bindingResult返回的errors一直為0。校驗不起作用。

    第二步:創建需要校驗的參數bean類

    需要引入的類:

    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Pattern;
    @Component
    public class UserScheduleByManualBean implements Serializable { 
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 8093326646402381469L; 
    	@NotBlank(message = "賽事不能為空")
    	private String matchEventName; // 賽事名稱
     
    	@NotBlank(message = "發槍時間不能為空")
    	@Pattern(regexp = "((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$", message = "發槍格式錯誤")
    	private String gunTime; // 發槍時間
    	
    	@NotNull(message = "國家ID不能為空")
    	@Min(value = 0,message = "國家ID數據格式錯誤")
    	private int dicCountryId; // 國家ID
    	
    	@NotBlank(message = "國家名稱不能為空")
    	private String countryName; // 國家名稱
    	
    	@NotNull(message = "省份ID不能為空")
    	@Min(value = 0,message = "省份ID數據格式錯誤")
    	private int dicProvinceId; // 省份ID
    	@NotBlank(message = "省份名稱不能為空")
    	private String provinceName; // 省份名稱
    	
    	@NotNull(message = "城市ID不能為空")
    	@Min(value = 0,message = "城市ID數據格式錯誤")
    	private int dicCityId; // 城市ID
    	@NotBlank(message = "城市名稱不能為空")
    	private String cityName; // 城市名稱	
    	
    	private String projectName; // 項目名稱
    	private String remarks; // 說明 可以為空
    	private String bib; // 賽號 可以為空
     
        //get和set方法忽略
    }

    這里一定要注意兩個問題

    1: bean上加@Component注解,并且spring配置要掃描到這個包,否則也不生效。

    2: @valid方式校驗,有很多限制注解(后面附表)。不通的限制注解,對應的數據類型不一樣。比如:@Pattern注解,只能在String類型上使用。我一開始希望int的屬性也直接通過正則做校驗。結果報錯:HV000030: No validator could be found for constraint 'javax.validation.constraints.Pattern' validating type 'java.lang.Integer'

    3: 注解可以多個

    第三步:寫controller類

    首先,我們先創建一個BaseController抽象類,其中有BindingResult校驗方法,其他所有的controller繼承該類實現校驗。

    引入的java類:

       import org.springframework.validation.BindingResult;
           import javax.validation.Valid;
    public abstract class BaseController { 
    	/**
    	 * 校驗通過bean當參數的驗證結果方法
    	 * @param bindingResult
    	 * @return
    	 */
    	protected Map<String, Object> validate(BindingResult bindingResult) { 
    		Map<String, Object> ret = new HashMap<>();
    		boolean isTrue = true;
    		StringBuilder sb = new StringBuilder("");
    		if (bindingResult.hasErrors()) {
    			bindingResult.getAllErrors().forEach(o ->{
                    FieldError error = (FieldError) o;
                    sb.append("|" + error.getDefaultMessage());//	添加錯誤信息
                });
    			isTrue = false;
    		} 
    		ret.put("isTrue", isTrue);
    		ret.put("message", sb.toString());// 錯誤信息
    		return ret;
    	}
    }

    其次,我們創建業務的controller類,繼承BaseController。

    @Api(value = "TestController-API", description = "測試操作接口")
    @Controller
    @RequestMapping("testController/*")
    public class TestController extends BaseController { 
        @RequestMapping(value = "tstex", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
    	@ApiOperation(value = "測試異常方法", notes = "測試異常方法")
    	public @ResponseBody String tstex(@Valid @RequestBody UserScheduleByManualBean userScheduleByManualBean,
    			BindingResult bindingResult) {
    		Map<String, Object> ret = new HashMap<>();
     
    		// 校驗userScheduleByManualBean是否合法
    		Map<String, Object> validRet = validate(bindingResult);
    		boolean isTrue = (Boolean) validRet.get("isTrue");
    		if (!isTrue) {
    			// 參數不合法
    			String erroMsg = (String) validRet.get("message");
    			ret.put("resultCode", “0001”);
    			ret.put("resultDesc", “參數錯誤” + erroMsg);
    			return JsonUtil.gson_ObjectToJSON(ret);
    		} 
    		ret.put("resultCode", “0000”);
    		ret.put("resultDesc", “成功”);
    		return JsonUtil.gson_ObjectToJSON(ret);
    	}
    }

    這里需要注意的問題:@Valid和@RequestBody是有位置關系的,必須@Valid在前面。BindingResult bindingResult作為參數傳遞進來,然后通過validate校驗參數,并設置統一的返回結果。

    通過swagger運行結果如下:

    springmvc項目使用@Valid+BindingResult遇到的問題怎么解決

    springmvc項目使用@Valid+BindingResult遇到的問題怎么解決

    附 件

    限制注解說明限制類型樣例
    @Null限制只能為null全部@Null(message="")
    @NotNull限制必須不為null全部@NotNull(message="")
    @AssertFalse限制必須為false

    @AssertTrue限制必須為true

    @DecimalMax(value)限制必須為一個不大于指定值的數字

    @DecimalMin(value)限制必須為一個不小于指定值的數字

    @Digits(integer,fraction)限制必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction

    @Future限制必須是一個將來的日期

    @Max(value)限制必須為一個不大于指定值的數字int@Max(value=100,message="")
    @Min(value)限制必須為一個不小于指定值的數字int@Min(value=100,message="")
    @Past限制必須是一個過去的日期

    @Pattern(value)限制必須符合指定的正則表達式String

    @Pattern(regexp="",message="")

    @Size(max,min)限制字符長度必須在min到max之間

    @NotEmpty驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)String

    @NotEmpty(message = "")

    @NotBlank驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應用于字符串且在比較時會去除字符串的空格String

    @NotBlank(message = "")

    @Email驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式String

    “springmvc項目使用@Valid+BindingResult遇到的問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    郑州市| 即墨市| 旌德县| 昆明市| 芷江| 弥渡县| 义乌市| 汉沽区| 双鸭山市| 尉氏县| 金乡县| 五寨县| 京山县| 通化市| 海南省| 改则县| 保德县| 桐乡市| 济宁市| 翁源县| 陆良县| 南岸区| 隆安县| 织金县| 双牌县| 厦门市| 武强县| 镇宁| 阆中市| 资兴市| 静乐县| 乌鲁木齐市| 昭觉县| 闽清县| 凤山市| 大冶市| 阿图什市| 沅江市| 保亭| 秦安县| 康平县|