当前位置: 首页 > news >正文

淄博网站建设优化公司百度广告官网

淄博网站建设优化公司,百度广告官网,高端网站制作技术,广州市建设工程造价管理站Validated、Valid和BindingResultBean Validation是Java定义的一套基于注解的数据校验规范,比如Null、NotNull、Pattern等,它们位于 javax.validation.constraints这个包下。hibernate validator是对这个规范的实现,并增加了一些其他校验注解…
  1. @Validated、@Valid和BindingResult

Bean Validation是Java定义的一套基于注解的数据校验规范,比如@Null、@NotNull、@Pattern等,它们位于 javax.validation.constraints这个包下。

hibernate validator是对这个规范的实现,并增加了一些其他校验注解,如 @NotBlank、@NotEmpty、@Length等,它们位于org.hibernate.validator.constraints这个包下。

依赖

hibernate validator框架已经集成在 spring-boot-starter-web中,所以无需再添加其他依赖。如果不是Spring Boot项目,需要添加如下依赖。

@Valid和@Validated 区别

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种)。

javax提供了@Valid,配合BindingResult可以直接提供参数验证结果(标准JSR-303规范)。

@Validation对@Valid进行了二次封装,在使用上并没有区别,但在分组、注解位置、嵌套验证等功能上有所不同

  • 分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。

@Valid:没有分组校验的功能。

  • 注解地方

@Validated:用在类型、方法和方法参数上(类, 方法, 参数)。但不能用于成员属性。

@Valid:可以用在方法、构造函数、方法参数和成员属性上(方法, 构造器, 参数,字段, 泛型),可以用@Valid实现嵌套验证

两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能
如A类中引用B类,且A、B二类都有内部校验,为了使B类也生效,在A类中引用B类时,在B类变量上加@Valid注解,如果B类为集合等类型且不能为空还需要再加@NotEmpty。

BindingResult

BindingResult用在实体类校验信息返回结果绑定。

该类作为方法入参,要写在实体对象后面。

@PostMapping("/menus")
public Result addMenu(@RequestBody @Valid Menu menu, BindingResult result) {}
  1. 规则注解

validator内置注解

hibernate validator扩展注解

分类

空与非空

注解

支持Java类型

说明

@Null

Object

为null

@NotNull

Object

不为null

@NotBlank

CharSequence

不为null,且必须有一个非空格字符

@NotEmpty

CharSequence、Collection、Map、Array

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

Boolean

注解

支持Java类型

说明

备注

@AssertTrue

boolean、Boolean

为true

为null有效

@AssertFalse

boolean、Boolean

为false

为null有效

日期

注解

支持Java类型

说明

备注

@Future

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

验证日期为当前时间之后

为null有效

@FutureOrPresent

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

验证日期为当前时间或之后

为null有效

@Past

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

验证日期为当前时间之前

为null有效

@PastOrPresent

Date、

Calendar、

Instant、

LocalDate、

LocalDateTime、

LocalTime、

MonthDay、

OffsetDateTime、

OffsetTime、

Year、

YearMonth、

ZonedDateTime、

HijrahDate、

JapaneseDate、

MinguoDate、

ThaiBuddhistDate

验证日期为当前时间或之前

为null有效

数值

注解

支持Java类型

说明

备注

@Max

BigDecimal、BigInteger,

byte、short、int、long以及包装类

小于或等于

为null有效

@Min

BigDecimal、BigInteger,

byte、short、int、long以及包装类

大于或等于

为null有效

@DecimalMax

BigDecimalBigInteger、CharSequence,

byte、short、int、long以及包装类

小于或等于

为null有效

@DecimalMin

BigDecimal、BigIntegerCharSequence,

byte、short、int、long以及包装类

大于或等于

为null有效

@Negative

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包装类

负数

为null有效,0无效

@NegativeOrZero

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包装类

负数或零

为null有效

@Positive

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包装类

正数

为null有效,0无效

@PositiveOrZero

BigDecimal、BigInteger,

byte、short、int、long、float、double以及包装类

正数或零

为null有效

@Digits(integer = 3, fraction = 2)

BigDecimal、BigInteger、CharSequence,

byte、short、int、long以及包装类

整数位数和小数位数上限

为null有效

@Length

String

字符串长度范围

@Length

@Range

数值类型和String

指定范围

@Range

其他

注解

支持Java类型

说明

备注

@Pattern

CharSequence

匹配指定的正则表达式

为null有效

@Email

CharSequence

邮箱地址

为null有效,默认正则 '.*'

@Size

CharSequence、Collection、Map、Array

大小范围(length/size>0)

为null有效

@URL

URL地址验证

@URL

  1. 使用

单参数校验

需要在参数前添加注解,而且controller类上必须添加@Validated注解。

@RestController
@RequestMapping("/menu")
@Validated // 单参数校验需要加的注解
public class SysMenuController {@DeleteMapping("/menus")public Result deleteMenu(@NotNull(message = "id不能为空") Long id) {}
}

对象参数校验

先在对象的校验属性上添加注解,然后在Controller方法的对象参数前添加@Valid、@Validated

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

对象嵌套

// 对象
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){
}

分组校验

新建组

Validated有自己默认的组 Default.class

public interface Update {
}
public interface Add  extends Default {
}
// 对象
public class User {@NotBlank(message = "id不能为空",groups = {Update.class})private String id;private String name;@NotBlank(message = "密码不能为空",groups = {Add.class})private String password;
}
id属性的校验属于Update分组的校验
password属性的校验属于Add、Default分组的校验

使用分组

使用默认分组:Add分组继承Default,所以校验password,不校验id

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

使用Update分组:只校验id,不校验password

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

全局异常处理类

缺少参数抛出的异常是MissingServletRequestParameterException

单参数校验失败后抛出的异常是ConstraintViolationException

get请求的对象参数校验失败后抛出的异常是BindException

post请求的对象参数校验失败后抛出的异常是MethodArgumentNotValidException

不同异常对象的结构不同,对异常消息的提取方式也就不同。

@Slf4j
@RestControllerAdvice
public class ExceptionAdvice {@ResponseBody@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)// 设置状态码为500@ExceptionHandler(MethodArgumentNotValidException.class)public String postExceptionHandler(MethodArgumentNotValidException e){log.error("执行异常",e);BindingResult exceptions = e.getBindingResult();if (exceptions.hasErrors()) {}}@ResponseBody@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)// 设置状态码为500@ExceptionHandler(ConstraintViolationException.class)public String paramExceptionHandler(ConstraintViolationException e){log.error("执行异常",e);}
}

BindingResult异常

Controller方法的中处理

@PostMapping("addUser")
public Result addUser(@RequestBody @Valid User user,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 new Result(“”, "", null);
}

AOP校验

/**
*将此注解加在需要进行参数校验的方法上,
*/
@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);//响应错误信息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());}}}}});}}/*** 校验*/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.wooajung.com/news/23845.html

相关文章:

  • 西安模板网站建设seo流量优化
  • 房产网站内容建设部门规划搜狗整站优化
  • 计算机应用技术php网站开发公众号怎么做文章推广
  • wordpress并列插件上海百度seo公司
  • 学校网站制作怎么有自己的网站
  • 建设银行网站用户名网站seo优化课程
  • 做网站运营需要什么证整站优化要多少钱
  • wordpress使用文档插件广东seo网站优化公司
  • 行业网站策划方案百度网址安全检测
  • 北京互联网公司集中在哪些地方百度的搜索引擎优化
  • 欧美做电影 迅雷下载网站谷歌搜索引擎入口google
  • 北京网站推广排名电商推广平台
  • 三星网上商城app官方版企业网站的搜索引擎推广与优化
  • 织梦想把网站上传到现有网站的文件夹中测试现有网站能正常使用北京做百度推广的公司
  • 网站 微信认证白酒营销策划方案
  • 金融网站如何做设计方案快链友情链接平台
  • 市住房官方建设委网站抖音关键词排名系统
  • html网站建设实例代码查询关键词
  • 北京建网站定制价格成人厨师短期培训班
  • 网站淘客怎么做旅游推广赚佣金哪个平台好
  • 做视频直播网站需要多少资金百度热搜榜排行
  • 沈阳做网站公司哪家好网络营销的特点分别是
  • 网站建设公司谁管聊城seo优化
  • 做网站需要公司吗国内最新消息新闻
  • 网站制作需要多少钱济南计算机培训机构哪个最好
  • 网站建设公司 温州广告投放运营主要做什么
  • 网站的术语深圳网站制作设计
  • 东莞网站建设公司电商运营培训课程有哪些
  • 软件测试就业前景怎样如何优化网络环境
  • 硅胶东莞网站建设抖音流量推广神器软件