欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的三種校驗(yàn)注解的使用(@Valid,@Validated和@PathVariable)

 更新時(shí)間:2022年04月27日 11:06:13   作者:攻城獅Chova  
本文主要介紹了Java中的三種校驗(yàn)注解的使用(@Valid,@Validated和@PathVariable),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

@Valid和@Validated

@Valid和@Validated比較

  • 相同點(diǎn):
    • @Valid注解和 @Validated注解都是開啟校驗(yàn)功能的注解
  • 不同點(diǎn):
    • @Validated注解是Spring基于 @Valid注解的進(jìn)一步封裝,并提供比如分組,分組順序的高級(jí)功能
    • 使用位置不同:
      • @Valid注解 : 可以使用在方法,構(gòu)造函數(shù),方法參數(shù)和成員屬性上
      • @Validated注解 : 可以用在類型,方法和方法參數(shù)上. 但是不能用在成員屬性上

@Valid高級(jí)使用

@Valid級(jí)聯(lián)校驗(yàn)

  • 級(jí)聯(lián)校驗(yàn): 也叫嵌套檢測(cè).嵌套就是一個(gè)實(shí)體類包含另一個(gè)實(shí)體類
  • @Valid和可以用在成員屬性的字段上,因此 @Valid可以提供級(jí)聯(lián)校驗(yàn)
  • 示例:
    @Data
    public class Hair {
    	
    	@NotBlank(message = "頭發(fā)長(zhǎng)度必須提交!")
    	private Double length;
    
      	@NotBlank(message = "頭發(fā)顏色必須提交!")
      	private String color;
    }
    
    @Data
    public class Person {
    	
    	@NotBlank(message = "用戶姓名必須提交!")
    	@Size(min=2, max=8)
    	private String userName;
    
      	// 添加@Valid注解實(shí)現(xiàn)嵌套檢測(cè)
      	@Valid
        @NotEmpty(message = "用戶要有頭發(fā)!")
        private List<Hair> hairs;
    }
     
    @PostMapping("/person")
    public Result addPerson(@Valid @RequestBody Person person) {
    	return Result.buildSuccess(person);
    }
    • 只是在方法參數(shù)前面添加 @Valid@Validated注解,不會(huì)對(duì)嵌套的實(shí)體類進(jìn)行校驗(yàn).要想實(shí)現(xiàn)對(duì)嵌套的實(shí)體類進(jìn)行校驗(yàn),需要在嵌套的實(shí)體類屬性上添加 @Valid注解

@Validated高級(jí)使用

@Validated分組校驗(yàn)

  • 分組校驗(yàn):
    • 對(duì)指定的組開啟校驗(yàn),可以分別作用于不同的業(yè)務(wù)場(chǎng)景中
    • 分組校驗(yàn)是由 @Validated注解中的value提供的
  • groups:
    • JSR 303校驗(yàn)注解中的分組方法groups
    • 示例:
    @Data
    public class PersonGroup {
    	
    	public interface AddGroup {}
      
      	public interface UpdateGroup {}
    
      	// @Validated注解value方法指定分組UpdateGroup.class時(shí)校驗(yàn)
      	@NotBlank(message = "用戶ID必須提交!", groups = UpdateGroup.class)
      	private String id;
    
      	// @Validated注解value方法指定分組AddGroup.class或者分組UpdateGroup.class時(shí)校驗(yàn)
      	@NotBlank(message = "用戶的姓名必須提交!", groups = {AddGroup.class, UpdateGroup.class}) 
      	private String name;
    
      	// @Validated注解value方法未指定分組時(shí)校驗(yàn)
      	@Range(min = 1, max = 200, message = "用戶的年齡必須提交!")
      	private int age;
    }
  • 開啟分組校驗(yàn): 通過 @Validated注解的value方法對(duì)指定的分組開啟校驗(yàn)
@RestController
@RequestMapping("/person")
public class PersonGroupController {
	
	// 不指定分組時(shí)校驗(yàn)
	@GetMapping("/person")
	public Result getPerson(@Validated @RequestBody PersonGroup person) {
		return Result.buildSuccess(person);
	}

	// 指定AddGroup分組校驗(yàn)
	@PostMapping("/person")
	public Result addPerson(@Validated(value = PersonGroup.AddGroup.class) @RequestBody PersonGroup person) {
		return Result.buildSuccess(person);
	}

	// 指定UpdateGroup分組校驗(yàn)
	@PutMapping("/person")
	public Result updatePerson(@Validated(value = PersonGroup.updateGroup.class) @RequestBody PersonGroup person) {
		return Result.buildSuccess(person);
	}
}
  • 校驗(yàn)方法添加groups的值來指定分組,只有使用 @Validated注解的value的值指定這個(gè)分組時(shí),開會(huì)開啟注解的校驗(yàn)數(shù)據(jù)的功能

@Validated分組校驗(yàn)順序

  • 默認(rèn)情況下,分組間的約束是無序的,但是在一些特殊的情況下可能對(duì)分組間的校驗(yàn)有一定的順序
    • 比如第二組的分組的約束的校驗(yàn)需要依賴第一組的穩(wěn)定狀態(tài)來進(jìn)行,此時(shí),要求分組間的約束校驗(yàn)一定要有順序
  • 分組校驗(yàn)順序通過使用 @GroupSequence注解實(shí)現(xiàn)
  • 示例:
@Data
public class UserGroupSequence {
	
	public interface FirstGroup {}

	public interface SecondGroup {}

	// 使用GroupSequence定義分組校驗(yàn)順序:按照FirstGroup,SecondGroup分組順序進(jìn)行校驗(yàn)
	@GroupSequence({FirstGroup.class, SecondGroup.class})
	public interface Group {}

	@NotEmpty(message = "用戶ID必須提交!", group = FirstGroup.class)
	private String userId;

	@NotEmpty(message = "用戶姓名必須提交!", group = FirstGroup.class)
	@Size(min = 2, max = 8, message = "用戶姓名的長(zhǎng)度在2~8之間", goup = Second.class)
	private String userName;
} 
@RestController
@RequestMapping("/user")
public class UserGroupSequenceController {
	// 這里方法中@Validated注解value的值是Group.class
	@PostMapping("/user")
	public Result addGroup(@Validated(value = Group.class) @RequestBody UserGroupSequence user) {
		return Result.buildSuccess(user);
	}
}
  • 使用 @GroupSequence注解指定分組校驗(yàn)順序后,第一組分組的約束的校驗(yàn)沒有通過后,就不會(huì)進(jìn)行第二組分組的約束的校驗(yàn)

@Validated非實(shí)體類校驗(yàn)

  • 在非實(shí)體類上添加 @Validated注解對(duì)非實(shí)體類進(jìn)行校驗(yàn)
@Validated
public class AnnotationController {
	
	@GetMapping("/person")
	public Result getAge(@Range(min = 2, max = 8, message = "年齡在3~8歲!") @RequestParam int age) {
		return Result.buildSuccess(age);
	}
}
  • GlobalExceptionHandler中添加全局統(tǒng)一異常處理方法:
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Result resolveConstraintViolationException(ConstraintVilationException exception) {
	Set<ConstraintVilation<?>> constraintVilations = exception.getConstraintVilations();
	// 處理異常信息
	if (!CollectionUtils.isEmpty(constraintVilations)) {
		StringBuilder messageBuilder = new StringBuilder();
		for (ConstraintVilation constraintViolation : constraintVilations) {
			messageBuilder.append(constraintVilation.getMessage()).append(",");
		}
		String errorMessage = messageBuilder.toString();
		if (errorMessage.length() > 1) {
			errorMessage.substring(0, errorMessage.length() - 1);
		}
		return Result.builderFailure(ErrorStatus.ILLEGAL_DATA.getCode(), errorMessage);
	} 
	return Result.builderFailure(ErrorStatus.ILLEGAL_DATA.getCode(), exception.getMessage())
}

@PathVariable

  • @PathVariable的作用: 用來指定請(qǐng)求URL路徑里面的變量
  • @PathVariable@RequestParam的區(qū)別:
    • @PathVariable用來指定請(qǐng)求URL中的變量
    • @RequestParam用來獲取靜態(tài)的URL請(qǐng)求入?yún)?/li>

正則表達(dá)式校驗(yàn)

  • 使用正則表達(dá)式校驗(yàn) @PathVariable指定的路徑變量
// 請(qǐng)求路徑中的id必須是數(shù)字,否則尋找不到這個(gè)路徑404
@GetMapping("/user/{id:\\d+}")
public Result getId(@PathVariable(name="id") String userId) {
	return Result.buildSuccess(userId);
}

繼承BasicErrorController類

  • @ControllerAdvice注解只能處理進(jìn)入控制器方法拋出的異常
  • BasicErrorController接口可以處理全局異常
  • @PathVariable路徑校驗(yàn)異常不是控制器方法拋出的,此時(shí)還沒有進(jìn)入控制器方法:
    • BasicErrorController處理異常,比如404異常時(shí),會(huì)跳轉(zhuǎn)到 /error路徑,此時(shí)會(huì)返回錯(cuò)誤的html頁(yè)面
    • 為了保證返回結(jié)果統(tǒng)一,繼承BasicErrorController類,重寫BasicErrorController接口中的錯(cuò)誤處理方法
@RestController
public class PathErrorController extends BasicErrorController {
	
	@Autowired
	public PathErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties, List<ErrorViewResolver> errorViewResolvers) {
		super(errorAttributes, serverProperties.getError(), errorViewResolvers);
	}

	/**
	 * 處理html請(qǐng)求
	 */
	@Override
	public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
		HttpStatus status = getStatus(request);
		Map<String, Object> model = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.TEXT_HTML));
		ModelAndView modelAndView = new ModelAndView("pathErrorPage", model, status);
		return modelAndView;
	}
	
	/**
	 * 處理json請(qǐng)求
	 */
	@Override
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		Map<String, Object> body = getErrorAttributes(request, isIncludeStackTrace(request, MediaType.ALL));
		
		Map<String, Object> responseBody = new HashMap<>(8);
		responseBody.put("success", false);
		responseBody.put("code", body.get("status"));
		responseBody.put("message", body.get("error")); 
		
		return new ResponseEntity<>(responseBody, HttpStatus.OK);
	}
} 

自定義校驗(yàn)注解

  • 使用場(chǎng)景:
    • 對(duì)某一個(gè)只能輸入指定值的字段進(jìn)行校驗(yàn). 此時(shí)需要使用自定義注解實(shí)現(xiàn)
  • 定義自定義的注解 @Show :
@Documented
@Constraint(validateBy = {Show.ShowConstraintValidator.class})
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Rentation(RUNTIME)
public @interface Show {
	String message() default "{com.oxford.annotation.Show.message}";

	Class<?>[] groups() default {};

	Class<? extends Payload>[] payload() default {};
	
	int[] value();

	class ShowConstraintValidator implements ConstraintValidator<Show, Integer> {
		
		private Set<Integer> set = new HashSet<>();

		/**
		 * 初始化操作
		 * 獲取value屬性指定的數(shù)字,保存到Set集合中
		 */
		@Override
		public void initilize(Show constraintAnnotation) {
			int[] value = constraintAnnotation.value();
			for (int v : value) {
				set.add(i);
			}
		}	

		@Override
		public boolean isValid(Integer value, ConstraintValidatorContext context) {
			return set.contains(value);
		}
	} 
}
  • 注意點(diǎn):
    • @Constraint注解:
      • 將自定義的注解和實(shí)現(xiàn)的校驗(yàn)類聯(lián)系起來
    • 自定義校驗(yàn)注解類需要實(shí)現(xiàn)ConstraintValidator<A extends Annotation, T> 接口
      • 接口中第一個(gè)泛型參數(shù)表示的是自定義注解類
      • 接口中第二個(gè)泛型參數(shù)表示的是校驗(yàn)的屬性的值的類型
    • initialize() 方法:
      • 獲取到自定義注解中的相關(guān)的數(shù)據(jù)
    • isValid() 方法:
      • 實(shí)現(xiàn)自定義的校驗(yàn)邏輯
      • 返回boolean類型的校驗(yàn)結(jié)果
  • 自定義注解的使用:
@Data
public class AnnotationQuery {
	
	@Show(value = {0, 1}, message = "數(shù)值只能是0或者1")
	private Integer isShow;
}
@PostMapping("/annotation")
public Result addAnnotation(@Validated @RequestBody AnnotationQuery annotation) {
	return Result.buildSuccess(annotation);
}

到此這篇關(guān)于Java中的三種校驗(yàn)注解的使用(@Valid,@Validated和@PathVariable)的文章就介紹到這了,更多相關(guān)Java 校驗(yàn)注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring如何替換掉默認(rèn)common-logging.jar

    Spring如何替換掉默認(rèn)common-logging.jar

    這篇文章主要介紹了Spring如何替換掉默認(rèn)common-logging.jar,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • IDEA中如何引入spring的命名空間

    IDEA中如何引入spring的命名空間

    這篇文章主要介紹了IDEA中如何引入spring的命名空間問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java線程的并發(fā)工具類實(shí)現(xiàn)原理解析

    Java線程的并發(fā)工具類實(shí)現(xiàn)原理解析

    本文給大家講解Java線程的并發(fā)工具類的一些知識(shí),通過適用場(chǎng)景分析大數(shù)據(jù)量統(tǒng)計(jì)類任務(wù)的實(shí)現(xiàn)原理和封裝,多個(gè)示例代碼講解的非常詳細(xì),對(duì)java線程并發(fā)工具類相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)下吧
    2021-06-06
  • JSON.toJSONString()方法在Java中的使用方法及應(yīng)用場(chǎng)景

    JSON.toJSONString()方法在Java中的使用方法及應(yīng)用場(chǎng)景

    這篇文章主要給大家介紹了關(guān)于JSON.toJSONString()方法在Java中的使用方法及應(yīng)用場(chǎng)景,JSON.toJSONString是將對(duì)象轉(zhuǎn)化為Json字符串,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Java中的模板模式說明與實(shí)現(xiàn)

    Java中的模板模式說明與實(shí)現(xiàn)

    這篇文章主要介紹了Java中的模板模式說明與實(shí)現(xiàn),模板方法模式,又叫模板模式,在一個(gè)抽象類公開定義了執(zhí)行它的方法的模板,它的子類可以更需要重寫方法實(shí)現(xiàn),但可以成為典型類中定義的方式進(jìn)行,需要的朋友可以參考下
    2023-10-10
  • springBoot mybatis 包掃描實(shí)例

    springBoot mybatis 包掃描實(shí)例

    這篇文章主要介紹了springBoot mybatis 包掃描實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring bean對(duì)象實(shí)例化實(shí)現(xiàn)過程圖解

    Spring bean對(duì)象實(shí)例化實(shí)現(xiàn)過程圖解

    這篇文章主要介紹了Spring bean對(duì)象實(shí)例化實(shí)現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 詳解Java中的 枚舉與泛型

    詳解Java中的 枚舉與泛型

    這篇文章主要介紹了 詳解Java中的 枚舉與泛型的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java設(shè)計(jì)模式之java中介者模式詳解

    Java設(shè)計(jì)模式之java中介者模式詳解

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java中介者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-09-09
  • Dubbo?retries?超時(shí)重試機(jī)制的問題原因分析及解決方案

    Dubbo?retries?超時(shí)重試機(jī)制的問題原因分析及解決方案

    這篇文章主要介紹了Dubbo?retries?超時(shí)重試機(jī)制的問題,解決方案是通過修改dubbo服務(wù)提供方,將timeout超時(shí)設(shè)為20000ms或者設(shè)置retries=“0”,禁用超時(shí)重試機(jī)制,感興趣的朋友跟隨小編一起看看吧
    2022-04-04

最新評(píng)論