中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

瑤海區(qū)網(wǎng)站建設(shè)中國(guó)關(guān)鍵詞官網(wǎng)

瑤海區(qū)網(wǎng)站建設(shè),中國(guó)關(guān)鍵詞官網(wǎng),wordpress 用戶(hù)頭像,wordpress中文頁(yè)面打不開(kāi)Validated、Valid和BindingResultBean Validation是Java定義的一套基于注解的數(shù)據(jù)校驗(yàn)規(guī)范,比如Null、NotNull、Pattern等,它們位于 javax.validation.constraints這個(gè)包下。hibernate validator是對(duì)這個(gè)規(guī)范的實(shí)現(xiàn),并增加了一些其他校驗(yàn)注解…
  1. @Validated、@Valid和BindingResult

Bean Validation是Java定義的一套基于注解的數(shù)據(jù)校驗(yàn)規(guī)范,比如@Null、@NotNull、@Pattern等,它們位于 javax.validation.constraints這個(gè)包下。

hibernate validator是對(duì)這個(gè)規(guī)范的實(shí)現(xiàn),并增加了一些其他校驗(yàn)注解,如 @NotBlank、@NotEmpty、@Length等,它們位于org.hibernate.validator.constraints這個(gè)包下。

依賴(lài)

hibernate validator框架已經(jīng)集成在 spring-boot-starter-web中,所以無(wú)需再添加其他依賴(lài)。如果不是Spring Boot項(xiàng)目,需要添加如下依賴(lài)。

@Valid和@Validated 區(qū)別

Spring Validation驗(yàn)證框架對(duì)參數(shù)的驗(yàn)證機(jī)制提供了@Validated(Spring's JSR-303規(guī)范,是標(biāo)準(zhǔn)JSR-303的一個(gè)變種)。

javax提供了@Valid,配合BindingResult可以直接提供參數(shù)驗(yàn)證結(jié)果(標(biāo)準(zhǔn)JSR-303規(guī)范)。

@Validation對(duì)@Valid進(jìn)行了二次封裝,在使用上并沒(méi)有區(qū)別,但在分組、注解位置、嵌套驗(yàn)證等功能上有所不同

  • 分組

@Validated:提供了一個(gè)分組功能,可以在入?yún)Ⅱ?yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。

@Valid:沒(méi)有分組校驗(yàn)的功能。

  • 注解地方

@Validated:用在類(lèi)型、方法和方法參數(shù)上(類(lèi), 方法, 參數(shù))。但不能用于成員屬性。

@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性上(方法, 構(gòu)造器, 參數(shù),字段, 泛型),可以用@Valid實(shí)現(xiàn)嵌套驗(yàn)證

兩者是否能用于成員屬性(字段)上直接影響能否提供嵌套驗(yàn)證的功能
如A類(lèi)中引用B類(lèi),且A、B二類(lèi)都有內(nèi)部校驗(yàn),為了使B類(lèi)也生效,在A類(lèi)中引用B類(lèi)時(shí),在B類(lèi)變量上加@Valid注解,如果B類(lèi)為集合等類(lèi)型且不能為空還需要再加@NotEmpty。

BindingResult

BindingResult用在實(shí)體類(lèi)校驗(yàn)信息返回結(jié)果綁定。

該類(lèi)作為方法入?yún)?#xff0c;要寫(xiě)在實(shí)體對(duì)象后面。

@PostMapping("/menus")
public Result addMenu(@RequestBody @Valid Menu menu, BindingResult result) {}
  1. 規(guī)則注解

validator內(nèi)置注解

hibernate validator擴(kuò)展注解

分類(lèi)

空與非空

注解

支持Java類(lèi)型

說(shuō)明

@Null

Object

為null

@NotNull

Object

不為null

@NotBlank

CharSequence

不為null,且必須有一個(gè)非空格字符

@NotEmpty

CharSequence、Collection、Map、Array

不為null,且不為空(length/size>0)

Boolean

注解

支持Java類(lèi)型

說(shuō)明

備注

@AssertTrue

boolean、Boolean

為true

為null有效

@AssertFalse

boolean、Boolean

為false

為null有效

日期

注解

支持Java類(lèi)型

說(shuō)明

備注

@Future

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

驗(yàn)證日期為當(dāng)前時(shí)間之后

為null有效

@FutureOrPresent

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

驗(yàn)證日期為當(dāng)前時(shí)間或之后

為null有效

@Past

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

驗(yàn)證日期為當(dāng)前時(shí)間之前

為null有效

@PastOrPresent

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

驗(yàn)證日期為當(dāng)前時(shí)間或之前

為null有效

數(shù)值

注解

支持Java類(lèi)型

說(shuō)明

備注

@Max

BigDecimal、BigInteger,

byte、short、int、long以及包裝類(lèi)

小于或等于

為null有效

@Min

BigDecimal、BigInteger,

byte、short、int、long以及包裝類(lèi)

大于或等于

為null有效

@DecimalMax

BigDecimalBigInteger、CharSequence,

byte、short、int、long以及包裝類(lèi)

小于或等于

為null有效

@DecimalMin

BigDecimal、BigIntegerCharSequence,

byte、short、int、long以及包裝類(lèi)

大于或等于

為null有效

@Negative

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包裝類(lèi)

負(fù)數(shù)

為null有效,0無(wú)效

@NegativeOrZero

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包裝類(lèi)

負(fù)數(shù)或零

為null有效

@Positive

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包裝類(lèi)

正數(shù)

為null有效,0無(wú)效

@PositiveOrZero

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包裝類(lèi)

正數(shù)或零

為null有效

@Digits(integer = 3, fraction = 2)

BigDecimal、BigInteger、CharSequence,

byte、short、int、long以及包裝類(lèi)

整數(shù)位數(shù)和小數(shù)位數(shù)上限

為null有效

@Length

String

字符串長(zhǎng)度范圍

@Length

@Range

數(shù)值類(lèi)型和String

指定范圍

@Range

其他

注解

支持Java類(lèi)型

說(shuō)明

備注

@Pattern

CharSequence

匹配指定的正則表達(dá)式

為null有效

@Email

CharSequence

郵箱地址

為null有效,默認(rèn)正則 '.*'

@Size

CharSequence、Collection、Map、Array

大小范圍(length/size>0)

為null有效

@URL

URL地址驗(yàn)證

@URL

  1. 使用

單參數(shù)校驗(yàn)

需要在參數(shù)前添加注解,而且controller類(lèi)上必須添加@Validated注解。

@RestController
@RequestMapping("/menu")
@Validated // 單參數(shù)校驗(yàn)需要加的注解
public class SysMenuController {@DeleteMapping("/menus")public Result deleteMenu(@NotNull(message = "id不能為空") Long id) {}
}

對(duì)象參數(shù)校驗(yàn)

先在對(duì)象的校驗(yàn)屬性上添加注解,然后在Controller方法的對(duì)象參數(shù)前添加@Valid、@Validated

// 對(duì)象
public class Menu {private Long menuId;@NotNull(message =parentId不能為空")private Long parentId;
}
@PostMapping("/menus")
public Result addMenu(@RequestBody @Valid Menu menu, BindingResult result) {
}

對(duì)象嵌套

// 對(duì)象
public class PagedQueryReqBody<T> {private Integer page_no;private Integer page_row_no;@NotNullprivate String page_flg;@Validprivate T data_request;
}public class DataReqPQ {@NotNullprivate String car_no;
}
// 接口
@PostMapping(value = "/queryParameter")
public Result queryParameter(@RequestBody @Validated PagedQueryReqBody<DataReqPQ> requestMsg, BindingResult result){
}

分組校驗(yàn)

新建組

Validated有自己默認(rèn)的組 Default.class

public interface Update {
}
public interface Add  extends Default {
}
// 對(duì)象
public class User {@NotBlank(message = "id不能為空",groups = {Update.class})private String id;private String name;@NotBlank(message = "密碼不能為空",groups = {Add.class})private String password;
}
id屬性的校驗(yàn)屬于Update分組的校驗(yàn)
password屬性的校驗(yàn)屬于Add、Default分組的校驗(yàn)

使用分組

使用默認(rèn)分組:Add分組繼承Default,所以校驗(yàn)password,不校驗(yàn)id

@PostMapping("/addUser")
public Resp addUser(@Validated @RequestBody User uer) {
}

使用Update分組:只校驗(yàn)id,不校驗(yàn)password

@PostMapping("/updateUser")
public Resp updateUser(@Validated(Update.class) @RequestBody User user) {
}
  1. 異常處理

全局異常處理類(lèi)

缺少參數(shù)拋出的異常是MissingServletRequestParameterException

單參數(shù)校驗(yàn)失敗后拋出的異常是ConstraintViolationException

get請(qǐng)求的對(duì)象參數(shù)校驗(yàn)失敗后拋出的異常是BindException

post請(qǐng)求的對(duì)象參數(shù)校驗(yàn)失敗后拋出的異常是MethodArgumentNotValidException

不同異常對(duì)象的結(jié)構(gòu)不同,對(duì)異常消息的提取方式也就不同。

@Slf4j
@RestControllerAdvice
public class ExceptionAdvice {@ResponseBody@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)// 設(shè)置狀態(tài)碼為500@ExceptionHandler(MethodArgumentNotValidException.class)public String postExceptionHandler(MethodArgumentNotValidException e){log.error("執(zhí)行異常",e);BindingResult exceptions = e.getBindingResult();if (exceptions.hasErrors()) {}}@ResponseBody@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)// 設(shè)置狀態(tài)碼為500@ExceptionHandler(ConstraintViolationException.class)public String paramExceptionHandler(ConstraintViolationException e){log.error("執(zhí)行異常",e);}
}

BindingResult異常

Controller方法的中處理

@PostMapping("addUser")
public Result addUser(@RequestBody @Valid User user,BindingResult result){//校驗(yàn)到錯(cuò)誤if (result.hasErrors()) {//獲得錯(cuò)誤信息列表List<String> errMsgs = result.getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(toList());String lists = StringUtils.join(lists, ";");return new Result(“” "", lists);}return new Result(“”, "", null);
}

AOP校驗(yàn)

/**
*將此注解加在需要進(jìn)行參數(shù)校驗(yàn)的方法上,
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamValid {
}
@Aspect
@Component
public class ParamValidAspect {private static final Logger log = LoggerFactory.getLogger(ParamValidAspect.class);@Before("@annotation(paramValid)")public void paramValid(JoinPoint point, ParamValid paramValid){Object[] paramObj = point.getArgs();if (paramObj.length > 0){Arrays.stream(paramObj).forEach(e ->{if (e instanceof BindingResult) {BindingResult result = (BindingResult) e;Result errorMap = this.validRequestParams(result);if (errorMap != null){ServletRequestAttributes res = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletResponse response = res.getResponse();response.setCharacterEncoding("UTF-8");response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);response.setStatus(HttpStatus.BAD_REQUEST.value());OutputStream output = null;try {output = response.getOutputStream();String error = objectMapper.writeValueAsString(errorMap);//響應(yīng)錯(cuò)誤信息output.write(error.getBytes("UTF-8"));}catch (IOException e){log.error(e.getMessage());}finally{try{if (output != null){output.close();}} catch (IOException e) {log.error(e.getMessage());}}}}});}}/*** 校驗(yàn)*/private Result validRequestParams(BindingResult result) {if (result.hasErrors()) {List<String> errMsgs = result.getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(toList());String lists = StringUtils.join(lists, ";");return new Result("", "", lists);}return null;}
}
http://www.risenshineclean.com/news/4164.html

相關(guān)文章:

  • 昆明網(wǎng)站開(kāi)發(fā)培訓(xùn)機(jī)構(gòu)整站優(yōu)化加盟
  • 網(wǎng)校網(wǎng)站怎么做網(wǎng)絡(luò)營(yíng)銷(xiāo)課程個(gè)人總結(jié)3000字
  • 浙江省住房建設(shè)廳繼續(xù)教育網(wǎng)站財(cái)經(jīng)新聞每日財(cái)經(jīng)報(bào)道
  • 成都網(wǎng)站建設(shè)服務(wù)平臺(tái)西安專(zhuān)業(yè)網(wǎng)絡(luò)推廣平臺(tái)
  • uc網(wǎng)站怎么做鄭州網(wǎng)絡(luò)營(yíng)銷(xiāo)公司哪個(gè)好
  • 站群系列服務(wù)器做視頻網(wǎng)站互聯(lián)網(wǎng)營(yíng)銷(xiāo)外包推廣
  • 怎么樣創(chuàng)建一個(gè)網(wǎng)站明星百度指數(shù)在線查詢(xún)
  • 沈陽(yáng)做網(wǎng)站哪家最便宜全媒體運(yùn)營(yíng)師報(bào)名入口
  • 廈門(mén)高端網(wǎng)站建設(shè)公司頁(yè)面設(shè)計(jì)
  • 項(xiàng)目經(jīng)理證書(shū)怎么考廣州百度網(wǎng)站排名優(yōu)化
  • wordpress+文章輸出北京百度關(guān)鍵詞優(yōu)化
  • 寧夏網(wǎng)站建設(shè)公司seo綜合查詢(xún)系統(tǒng)
  • 做網(wǎng)站需要干什么公司網(wǎng)頁(yè)制作模板
  • 膠州網(wǎng)站建設(shè)公司教育培訓(xùn)網(wǎng)站
  • 勝芳哪里做網(wǎng)站營(yíng)銷(xiāo)推廣投放平臺(tái)
  • 網(wǎng)絡(luò)營(yíng)銷(xiāo)網(wǎng)站建設(shè)知識(shí)網(wǎng)絡(luò)推廣優(yōu)化工具
  • 鄭州專(zhuān)業(yè)網(wǎng)站建設(shè)公司詳情seo如何優(yōu)化關(guān)鍵詞
  • 做網(wǎng)站免費(fèi)免費(fèi)發(fā)軟文的網(wǎng)站
  • 免費(fèi)網(wǎng)站源碼crm網(wǎng)站
  • 貴陽(yáng)網(wǎng)站優(yōu)化長(zhǎng)沙百度seo代理
  • 網(wǎng)站建設(shè)的技術(shù)風(fēng)險(xiǎn)seo 首頁(yè)
  • python網(wǎng)站開(kāi)發(fā)代碼成功營(yíng)銷(xiāo)案例分享
  • 阿里外貿(mào)平臺(tái)網(wǎng)站建設(shè)總推薦榜總點(diǎn)擊榜總排行榜
  • 做網(wǎng)站公司沒(méi)簽合同有什么好的推廣平臺(tái)
  • 威海高區(qū)建設(shè)局網(wǎng)站電商平臺(tái)排名
  • 國(guó)內(nèi)有哪些b2c網(wǎng)站產(chǎn)品推廣方案ppt模板
  • sem seo是什么意思呢搜索引擎優(yōu)化技術(shù)
  • 網(wǎng)站備案網(wǎng)站類(lèi)型萬(wàn)網(wǎng)是什么網(wǎng)站
  • 類(lèi)似于微博網(wǎng)站怎么做的怎么營(yíng)銷(xiāo)自己的產(chǎn)品
  • 手機(jī)代理服務(wù)器免費(fèi)版seo 適合哪些行業(yè)