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

揭阳网站制作怎样网站导航提交入口大全

揭阳网站制作怎样,网站导航提交入口大全,上海建筑建材业网官网入口,建设网站上传代码Valid和Validated Valid和Validated比较 相同点: Valid注解和 Validated注解都是开启校验功能的注解不同点: Validated注解是Spring基于 Valid注解的进一步封装,并提供比如分组,分组顺序的高级功能使用位置不同: Valid注解 : 可以使用在方法,构造函数,方法参数和成员属性上Va…

@Valid和@Validated

@Valid和@Validated比较

  • 相同点:
    • @Valid注解和 @Validated注解都是开启校验功能的注解
  • 不同点:
    • @Validated注解是Spring基于 @Valid注解的进一步封装,并提供比如分组,分组顺序的高级功能
    • 使用位置不同:
      • @Valid注解 : 可以使用在方法,构造函数,方法参数和成员属性上
      • @Validated注解 : 可以用在类型,方法和方法参数上. 但是不能用在成员属性上

@Valid高级使用

@Valid级联校验

  • 级联校验: 也叫嵌套检测.嵌套就是一个实体类包含另一个实体类
  • @Valid和可以用在成员属性的字段上,因此 @Valid可以提供级联校验
  • 示例:
    @Data
    public class Hair {@NotBlank(message = "头发长度必须提交!")private Double length;@NotBlank(message = "头发颜色必须提交!")private String color;
    }@Data
    public class Person {@NotBlank(message = "用户姓名必须提交!")@Size(min=2, max=8)private String userName;// 添加@Valid注解实现嵌套检测@Valid@NotEmpty(message = "用户要有头发!")private List<Hair> hairs;
    }@PostMapping("/person")
    public Result addPerson(@Valid @RequestBody Person person) {return Result.buildSuccess(person);
    }
    复制代码
    • 只是在方法参数前面添加 @Valid@Validated注解,不会对嵌套的实体类进行校验.要想实现对嵌套的实体类进行校验,需要在嵌套的实体类属性上添加 @Valid注解

@Validated高级使用

@Validated分组校验

  • 分组校验:
    • 对指定的组开启校验,可以分别作用于不同的业务场景中
    • 分组校验是由 @Validated注解中的value提供的
  • groups:
    • JSR 303校验注解中的分组方法groups
    • 示例:
    @Data
    public class PersonGroup {public interface AddGroup {}public interface UpdateGroup {}// @Validated注解value方法指定分组UpdateGroup.class时校验@NotBlank(message = "用户ID必须提交!", groups = UpdateGroup.class)private String id;// @Validated注解value方法指定分组AddGroup.class或者分组UpdateGroup.class时校验@NotBlank(message = "用户的姓名必须提交!", groups = {AddGroup.class, UpdateGroup.class}) private String name;// @Validated注解value方法未指定分组时校验@Range(min = 1, max = 200, message = "用户的年龄必须提交!")private int age;
    }
    复制代码
  • 开启分组校验: 通过 @Validated注解的value方法对指定的分组开启校验
@RestController
@RequestMapping("/person")
public class PersonGroupController {// 不指定分组时校验@GetMapping("/person")public Result getPerson(@Validated @RequestBody PersonGroup person) {return Result.buildSuccess(person);}// 指定AddGroup分组校验@PostMapping("/person")public Result addPerson(@Validated(value = PersonGroup.AddGroup.class) @RequestBody PersonGroup person) {return Result.buildSuccess(person);}// 指定UpdateGroup分组校验@PutMapping("/person")public Result updatePerson(@Validated(value = PersonGroup.updateGroup.class) @RequestBody PersonGroup person) {return Result.buildSuccess(person);}
}
复制代码
  • 校验方法添加groups的值来指定分组,只有使用 @Validated注解的value的值指定这个分组时,开会开启注解的校验数据的功能

@Validated分组校验顺序

  • 默认情况下,分组间的约束是无序的,但是在一些特殊的情况下可能对分组间的校验有一定的顺序
    • 比如第二组的分组的约束的校验需要依赖第一组的稳定状态来进行,此时,要求分组间的约束校验一定要有顺序
  • 分组校验顺序通过使用 @GroupSequence注解实现
  • 示例:
@Data
public class UserGroupSequence {public interface FirstGroup {}public interface SecondGroup {}// 使用GroupSequence定义分组校验顺序:按照FirstGroup,SecondGroup分组顺序进行校验@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 = "用户姓名的长度在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注解指定分组校验顺序后,第一组分组的约束的校验没有通过后,就不会进行第二组分组的约束的校验

@Validated非实体类校验

  • 在非实体类上添加 @Validated注解对非实体类进行校验
@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中添加全局统一异常处理方法:
@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的作用: 用来指定请求URL路径里面的变量
  • @PathVariable@RequestParam的区别:
    • @PathVariable用来指定请求URL中的变量
    • @RequestParam用来获取静态的URL请求入参

正则表达式校验

  • 使用正则表达式校验 @PathVariable指定的路径变量
// 请求路径中的id必须是数字,否则寻找不到这个路径404
@GetMapping("/user/{id:\\d+}")
public Result getId(@PathVariable(name="id") String userId) {return Result.buildSuccess(userId);
}
复制代码

继承BasicErrorController类

  • @ControllerAdvice注解只能处理进入控制器方法抛出的异常
  • BasicErrorController接口可以处理全局异常
  • @PathVariable路径校验异常不是控制器方法抛出的,此时还没有进入控制器方法:
    • BasicErrorController处理异常,比如404异常时,会跳转到 /error路径,此时会返回错误的html页面
    • 为了保证返回结果统一,继承BasicErrorController类,重写BasicErrorController接口中的错误处理方法
@RestController
public class PathErrorController extends BasicErrorController {@Autowiredpublic PathErrorController(ErrorAttributes errorAttributes, ServerProperties serverProperties, List<ErrorViewResolver> errorViewResolvers) {super(errorAttributes, serverProperties.getError(), errorViewResolvers);}/*** 处理html请求*/@Overridepublic 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请求*/@Overridepublic 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);}
} 
复制代码

自定义校验注解

  • 使用场景:
    • 对某一个只能输入指定值的字段进行校验. 此时需要使用自定义注解实现
  • 定义自定义的注解 @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属性指定的数字,保存到Set集合中*/@Overridepublic void initilize(Show constraintAnnotation) {int[] value = constraintAnnotation.value();for (int v : value) {set.add(i);}}	@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {return set.contains(value);}} 
}
复制代码
  • 注意点:
    • @Constraint注解:
      • 将自定义的注解和实现的校验类联系起来
    • 自定义校验注解类需要实现ConstraintValidator<A extends Annotation, T> 接口
      • 接口中第一个泛型参数表示的是自定义注解类
      • 接口中第二个泛型参数表示的是校验的属性的值的类型
    • initialize() 方法:
      • 获取到自定义注解中的相关的数据
    • isValid() 方法:
      • 实现自定义的校验逻辑
      • 返回boolean类型的校验结果
  • 自定义注解的使用:
@Data
public class AnnotationQuery {@Show(value = {0, 1}, message = "数值只能是0或者1")private Integer isShow;
}
复制代码
@PostMapping("/annotation")
public Result addAnnotation(@Validated @RequestBody AnnotationQuery annotation) {return Result.buildSuccess(annotation);
}
http://www.yayakq.cn/news/308666/

相关文章:

  • 自己做的美食分享到网站织梦手机网站怎么修改密码
  • 网站建设公司怎么发展wordpress 魅族
  • 播州区建设局网站高校思政教育工作网站建设
  • 做网站的风险分析南京网站开发个人
  • 网站标签中的图片怎么做的模板建站是什么意思
  • 网站服务器暂时不可用怎么办网站找回备案密码怎么不对
  • 外贸自建站是什么意思试描述一下网站建设的基本流程
  • 如何做原创小说网站安阳免费搭建自己的网站
  • 网站备案是备案域名还是空间站长统计app软件下载官网
  • 月付网站空间提供商免费注册网站云空间
  • 工商银行门户网站是什么意思辽阳网站制作
  • 企业园林设计网站模板廊坊网站关键字优化
  • 辽阳建网站徐州网站营销
  • 网站建设要考虑哪些内容辽宁网站建设专业学校
  • 个人网站模板吧保定网站推广公司
  • python是做网站的吗遵义在线遵义晚报
  • 企业工商信用查询烟台网站seo外包
  • 淘宝天猫做网站咨询pos机网站报单怎么做
  • 做旅游网站的好处wordpress本地环境404
  • 合肥网站建设电话网站建设岗位所需技能
  • 网站积分方案惠州企业建站系统
  • 青岛网站设计哪家便宜建筑公司取名参考
  • 吉林省电力建设总公司网站外贸网站做流量
  • 网站建设费用个人网站代码模板
  • 建个什么网站吗局域网里做网站
  • 澄迈网站新闻建设网站建设起到计划和指导作用
  • 手机电脑网站排名营销方案ppt模板
  • 安全的合肥网站建设邯郸市瑞荣网络科技有限公司
  • 学校网站做网页飘窗怎么做百度seo按天计费
  • 网站建站工具租网站服务器一个月多少钱