栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java如何使用JSR303校验数据与自定义校验注解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如何使用JSR303校验数据与自定义校验注解

一、自带校验注解实现数据校验

1、web项目导入依赖


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

下图可以看到spring-boot-starter-web依赖自动引入了hibernate-validator;

如果感兴趣的话还可以进入hibernate-validator查看引入了什么相关依赖

2、默认注解的使用

在需要校验的字段添加不同校验类型的注解

	
  @NotNull(message = "必须提交品牌id")
  @TableId
  private Long brandId;
  
  @NotBlank(message = "品牌名不可为空")
  private String name;
  
  @NotBlank(message = "logo必须提交")
  @URL(message = "logo地址格式错误")
  private String logo;
  
  private String descript;
  private Integer showStatus;
  
  @NotNull(message = "首字母必须提交")
  @Pattern(message = "首字母必须是一个字母,且a-z或A-Z", regexp = "/^[a-zA-Z]$/")
  private String firstLetter;

下图是自带的所有校验注解,可以进入查看源码的注释查看如何使用

3、设置谁需要进行数据校验!!!

在接口参数需要校验的对象前标注注解**@Valid** - 标明前台提交数据时该对象的字段需要进行数据校验


  @RequestMapping("/update")
  public R update(@Valid @RequestBody AttrGroupEntity attrGroup){
    attrGroupService.updateById(attrGroup);

    return R.ok();
  }

二、如何使用分组校验?

由于不同功能的接口接收的对象数据可能需要校验的字段不同,并不是每一个接口接收的对象的所有字段都需要校验的,所以则需要使用"分组校验"来区分不同的业务需要校验不同的字段,在这里我使用新增业务和修改业务为例。


根据上图可以看到,默认的注解源码不仅可以设置message(消息)还有一个可以设置group(分组)

1、创建分组接口


public interface AddGroup {
}

public interface UpdateGroup {
}

2、如何使用分组校验?

2.1、修改Bean每个字段上校验注解,设置group值

	
	@NotNull(message = "修改必须提交品牌id", groups = {UpdateGroup.class})
	@Null(message = "新增不需要提交品牌id", groups = {AddGroup.class})
	@TableId
	private Long brandId;
	
	@NotBlank(message = "品牌名不可为空", groups = {AddGroup.class, UpdateGroup.class})
	private String name;
	
	@NotBlank(message = "logo必须提交", groups = {AddGroup.class})
	@URL(message = "logo地址格式错误", groups = {AddGroup.class, UpdateGroup.class})
	private String logo;
	
	private String descript;
	
	private Integer showStatus;
	
	@NotNull(message = "首字母必须提交", groups = {AddGroup.class})
	@Pattern(message = "首字母必须是一个字母,且a-z或A-Z", regexp = "/^[a-zA-Z]$/", groups = {AddGroup.class, UpdateGroup.class})
	private String firstLetter;
	
	@Min(value = 0, groups = {AddGroup.class, UpdateGroup.class})
	private Integer sort;

2.2、设置什么业务需要使用什么分组进行校验


  @RequestMapping("/save")
  public R save(@Validated(value = {AddGroup.class}) @RequestBody BrandEntity brand){
		brandService.save(brand);

    return R.ok();
  }

  @RequestMapping("/update")
  public R update(@Validated(value = UpdateGroup.class) @RequestBody BrandEntity brand){
		brandService.updateById(brand);

    return R.ok();
  }

此时,不同业务就会校验不同的字段!!!

三、自定义校验注解

1、导入依赖的jar包


  javax.validation
  validation-api
  2.0.1.Final

2、编写自定义校验注解


@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@documented
@Constraint(validatedBy = {})
public @interface ListValue {

  String message() default "{com.mashanghaoyun.common.valid.ListValue.message}";

  Class[] groups() default {};

  Class[] payload() default {};

  int[] vals() default { };

}

3、编写自定义校验器


public class ListValueConstraintValidator implements ConstraintValidator {

  private Set set = new HashSet<>();

  
  @Override
  public void initialize(ListValue constraintAnnotation) {
    int[] vals = constraintAnnotation.vals();
    if (vals.length > 0) {
      for (int val : vals) {
 set.add(val);
      }
    }
  }

  
  @Override
  public boolean isValid(Integer value, ConstraintValidatorContext context) {
    if (set.size() > 0) {
      if (set.contains(value)) {
 return true;
      }
    }
    return false;
  }
}

3、关联自定义注解与校验器

4、使用自定义注解

到此这篇关于Java如何使用JSR303校验数据与自定义校验注解的文章就介绍到这了,更多相关Java JSR303校验数据内容请搜索考高分网以前的文章或继续浏览下面的相关文章希望大家以后多多支持考高分网!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/132088.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号