溫馨提示×

溫馨提示×

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

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

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

發(fā)布時間:2021-12-02 15:42:51 來源:億速云 閱讀:200 作者:iii 欄目:開發(fā)技術(shù)

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

    第一步:pom.xml中引入

    javax.validation和hibernate-validator

    <!-- springmvc的參數(shù)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的參數(shù)valid校驗依賴 結(jié)束 -->

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

    第二步:創(chuàng)建需要校驗的參數(shù)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 = "發(fā)槍時間不能為空")
    	@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 = "發(fā)槍格式錯誤")
    	private String gunTime; // 發(fā)槍時間
    	
    	@NotNull(message = "國家ID不能為空")
    	@Min(value = 0,message = "國家ID數(shù)據(jù)格式錯誤")
    	private int dicCountryId; // 國家ID
    	
    	@NotBlank(message = "國家名稱不能為空")
    	private String countryName; // 國家名稱
    	
    	@NotNull(message = "省份ID不能為空")
    	@Min(value = 0,message = "省份ID數(shù)據(jù)格式錯誤")
    	private int dicProvinceId; // 省份ID
    	@NotBlank(message = "省份名稱不能為空")
    	private String provinceName; // 省份名稱
    	
    	@NotNull(message = "城市ID不能為空")
    	@Min(value = 0,message = "城市ID數(shù)據(jù)格式錯誤")
    	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方式校驗,有很多限制注解(后面附表)。不通的限制注解,對應(yīng)的數(shù)據(jù)類型不一樣。比如:@Pattern注解,只能在String類型上使用。我一開始希望int的屬性也直接通過正則做校驗。結(jié)果報錯:HV000030: No validator could be found for constraint 'javax.validation.constraints.Pattern' validating type 'java.lang.Integer'

    3: 注解可以多個

    第三步:寫controller類

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

    引入的java類:

       import org.springframework.validation.BindingResult;
           import javax.validation.Valid;
    public abstract class BaseController { 
    	/**
    	 * 校驗通過bean當(dāng)參數(shù)的驗證結(jié)果方法
    	 * @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;
    	}
    }

    其次,我們創(chuàng)建業(yè)務(wù)的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) {
    			// 參數(shù)不合法
    			String erroMsg = (String) validRet.get("message");
    			ret.put("resultCode", “0001”);
    			ret.put("resultDesc", “參數(shù)錯誤” + erroMsg);
    			return JsonUtil.gson_ObjectToJSON(ret);
    		} 
    		ret.put("resultCode", “0000”);
    		ret.put("resultDesc", “成功”);
    		return JsonUtil.gson_ObjectToJSON(ret);
    	}
    }

    這里需要注意的問題:@Valid和@RequestBody是有位置關(guān)系的,必須@Valid在前面。BindingResult bindingResult作為參數(shù)傳遞進(jìn)來,然后通過validate校驗參數(shù),并設(shè)置統(tǒng)一的返回結(jié)果。

    通過swagger運行結(jié)果如下:

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

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

    附 件

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

    @AssertTrue限制必須為true

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

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

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

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

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

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

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

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

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

    @NotEmpty(message = "")

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

    @NotBlank(message = "")

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

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

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI