日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析

發(fā)布時(shí)間:2025/3/12 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Spring Validation

概念

在原先的編碼中,我們?nèi)绻?yàn)證前端傳遞的參數(shù),一般是在接受到傳遞過來的參數(shù)后,手動(dòng)在代碼中做 if-else 判斷,這種編碼方式會(huì)帶來大量冗余代碼,十分的不優(yōu)雅。
因此,推出了用注解的方式,來代替手動(dòng)判斷的方式,讓編碼更加的簡潔。

使用方式

引入注解:
一般在

org.springframework.boot spring-boot-starter-web

依賴中會(huì)有相關(guān)依賴,如果沒有的話,可以手動(dòng)引入下面的依賴。

org.hibernate.validator hibernate-validator 6.0.18.Finalcompile

get

針對 get 方式的請求,我們的請求參數(shù)直接放在參數(shù)列表里,因此直接在參數(shù)列表里加上想要驗(yàn)證的注解即可。

@GetMapping("xss") public void xssGet(@RequestParam("xss1") @Size(min = 1,max = 15,message = "長度不對") String xss, HttpServletRequest request) { }

在方法中,需要驗(yàn)證 xss 參數(shù)是否符合長度規(guī)范,即長度在 1-15 個(gè)字符之間,如果不對,則會(huì)提示出信息:長度不對。

post

在 post 方法中,傳遞的參數(shù)一般比較多,因此大多數(shù)情況下,采用的是傳遞的實(shí)體類的形式,然后用 json 的形式來傳遞數(shù)據(jù),在這種情況下,使用的方式為構(gòu)建一個(gè)實(shí)體類,然后在實(shí)體類的屬性上添加注解來做。

@Datapublic class SaveEmployeeParam implements Serializable { private static final long serialVersionUID = 8176094330224588795L; @NotEmpty private String Id; @Size(max = 15, message = "名稱必填,且最多為15個(gè)漢字") private String nickname; @PhoneValidationAnnotation private String phone;} @PostMapping public ResultEntity saveEmployee( @Valid @RequestBody SaveEmployeeParam saveEmployeeParam) { employeeService.saveEmployee(saveEmployeeParam); return ResultEntity.success(); }

通過該方式,在驗(yàn)證 SaveEmployeeParam 時(shí),框架就會(huì)自動(dòng)在接受參數(shù)時(shí),驗(yàn)證實(shí)體類中的值是否符合注解定義的規(guī)范。
在這里,就會(huì)驗(yàn)證 id 不能為空,nickname 的長度最多15個(gè)字符,以及我在手機(jī)號上添加了一個(gè)自定義注解,在確保其符合手機(jī)號規(guī)范。

分組校驗(yàn)

有時(shí),我們的一個(gè)實(shí)體類可能會(huì)在多種情況下使用,而又不想每種情況都定義一個(gè)實(shí)體類,則可以采用分組校驗(yàn)的方式,在不同的情況下,采用不同的校驗(yàn)方案。
首先自定義幾種不同情況下的接口:

public interface Create {}public interface Update {}


然后在指定的 pojo 上指定不同的情況下的策略:

@Datapublic class Demo { @Size(max = 15, groups = Create.class) @Size(max = 10, groups = Update.class) private String name; @Max(value = 100, groups = Create.class) @Max(value = 20, groups = Update.class) private Integer age;}


最后,在不同的方法上,根據(jù)業(yè)務(wù)需要指定使用不同的策略即可:

@PostMapping("xss3") public String xssPost(@Validated({Create.class}) @RequestBody Demo xss3) { return JSON.toJSONString(xss3); } @PutMapping("xss4") public String xssUpdate(@Validated({Update.class}) @RequestBody Demo xss4) { return JSON.toJSONString(xss4); }

在這種情況下,則在執(zhí)行 xssPost() 方法時(shí),采用是 Create 的執(zhí)行方案,在執(zhí)行 xssUpdate() 方法時(shí),采用的是 Update 方案。

提供的全部注解

JSR提供的校驗(yàn)注解:@Null必須為 null@NotNull必須不為 null@AssertTrue必須為 true@AssertFalse必須為 false@Min(value)大于等于 給定數(shù)字@Max(value)小于等于 給定數(shù)字@DecimalMin(value)大于等于 給定數(shù)值@DecimalMax(value)小于等于 給定數(shù)字@Size(max=, min=)集合或字符串長度在指定范圍內(nèi)@Digits指定整數(shù)部分和小數(shù)部分可以接受的最大位數(shù)@Past必須為一個(gè)過去的時(shí)間@Future必須為一個(gè)未來的時(shí)間@Pattern(regex=,flag=)給定字符串符合正則表達(dá)式Hibernate Validator提供的校驗(yàn)注解@NotBlank(message =)非 null,且長度必須大于 0@Email符合電子郵箱規(guī)范@Length(min=,max=)字符串長度在給定范圍內(nèi)@NotEmpty字符串或集合 非空@Range(min=,max=,message=)數(shù)字或字符串表示的數(shù)字在指定范圍內(nèi)

自定義

當(dāng)業(yè)務(wù)需要一些官方?jīng)]有提供的校驗(yàn)類型的話,為了方便,我們就需要考慮使用自定義注解的形式了。
這里,我們采用手機(jī)號的形式來演示一下,首先我們自定義一個(gè)注解:

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {PhoneValidation.class})public @interface PhoneValidationAnnotation { String message() default "手機(jī)號不符合規(guī)范格式";}


在代碼中,我們定義了默認(rèn)的錯(cuò)誤提示信息。
然后,我們寫一個(gè)實(shí)現(xiàn)類,來具體實(shí)現(xiàn)注解所要表達(dá)的含義:

public class PhoneValidation implements ConstraintValidator { String phonePattern; Pattern compile; @Override public void initialize(PhoneValidationAnnotation constraintAnnotation) { phonePattern = "1[3456789]d{9}"; compile = Pattern.compile(phonePattern); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return compile.matcher(value).matches(); }}

在代碼中,我們創(chuàng)建了一個(gè)類,實(shí)現(xiàn) ConstraintValidator 接口,并重寫其的初始化方法和驗(yàn)證方法,這樣,在驗(yàn)證參數(shù)的時(shí)候,其就會(huì)自動(dòng)調(diào)用相關(guān)的方法來驗(yàn)證傳遞的是否正確。

// 注解:要校驗(yàn)的數(shù)字在給定的集合中// 定義接口@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint(validatedBy = {EnumValidation.class})public @interface EnumValidationAnnotation { long[] limitValue() default {};}// 具體實(shí)現(xiàn)public class EnumValidation implements ConstraintValidator { private long[] longValues; @Override public void initialize(EnumValidationAnnotation constraintAnnotation) { longValues = constraintAnnotation.limitValue(); } @Override public boolean isValid(Long value, ConstraintValidatorContext context) { for (long longValue : longValues) { if (value == longValue) { return true; } } return false; }}

總結(jié)

以上是生活随笔為你收集整理的自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。