JSR303数据校验

一 简单实现

1.依赖(用到分组校验时添加)

<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.16.Final</version>
</dependency>

2.给entity加注解

	/**
	 * 品牌id
	 */
	@TableId
	@Null(message = "新增不能指定id",groups = {AddGroup.class})
	@NotNull(message = "更新需要指定id",groups = {UpdateGroup.class})
	private Long brandId;
	/**
	 * 品牌名
	 */
	@NotBlank(message = "不能為空",groups = {AddGroup.class,UpdateGroup.class})
	private String name;
	/**
	 * 品牌logo地址
	 */
	@NotEmpty(groups = {AddGroup.class})
	@URL(message = "logo必须是一个合法的url地址",groups = {AddGroup.class,UpdateGroup.class})
	private String logo;
	/**
	 * 介绍
	 */
	private String descript;
	/**
	 * 显示状态[0-不显示;1-显示]
	 */
	@ListValue(value = {0,1},groups = {AddGroup.class})
	private Integer showStatus;
	/**
	 * 检索首字母
	 */
	@NotEmpty(groups = {AddGroup.class})
	@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母只要一个大写字母")
	private String firstLetter;
	/**
	 * 排序
	 */
	@NotNull(groups = {AddGroup.class})
	@Min(value = 0,message = "排序必须大于0")
	private Integer sort;

3.告诉spring这个数据需要校验@Valid

@RequestMapping("/save")
    public R save(@Valid @RequestBody BrandEntity brand , BindingResult result){
		if (result.hasErrors()){
            HashMap<String, String> map = new HashMap<>();
            result.getFieldErrors().forEach((item)->{
                String msg = item.getDefaultMessage();
                String field = item.getField();
                map.put(field,msg);
            });
            return R.error(404,"数据校验失败").put("data",map);
        }else{
            brandService.save(brand);
        }
        return R.ok();
    }

二 分组校验

1 . 创建分组接口,不需要写如何代码,只做标识

 2. 给entity添加groups分组校验

例如:当要添加商品时,不需要提交brandId 所以用@Null注解, groups 数组里写了Addgroups.class 

@Validated标注里写了Addgroups.class ,就是说当请求到 '/save'时,需要验证标注了AddGroup组的注解 对应 @Null

当更新商品时,@Validated 要验证Update组,对应注解@NotNull

	/**
	 * 品牌id
	 */
	@TableId
	@Null(message = "新增不能指定id",groups = {AddGroup.class})
	@NotNull(message = "更新需要指定id",groups = {UpdateGroup.class})
	private Long brandId;
    @RequestMapping("/save")
    public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand , BindingResult result){
		if (result.hasErrors()){
            HashMap<String, String> map = new HashMap<>();
            result.getFieldErrors().forEach((item)->{
                String msg = item.getDefaultMessage();
                String field = item.getField();
                map.put(field,msg);
            });
            return R.error(404,"数据校验失败").put("data",map);
        }else{
            brandService.save(brand);
        }
        return R.ok();
    }

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

        return R.ok();
    }

三 自定义注解

自定义ListValue注解

/**
	 * 显示状态[0-不显示;1-显示]
	 */
	@ListValue(value = {0,1},groups = {AddGroup.class})
	private Integer showStatus;

1. 定义一个注解 和 校验器类 ListValueConstrainValidator

 源码:ConstraintValidator接口第一个指定注解,第二个指定要校验的类型

public interface ConstraintValidator<A extends Annotation, T> {
    default void initialize(A constraintAnnotation) {
    }

    boolean isValid(T var1, ConstraintValidatorContext var2);
}

 

 所以我们在自定义校验器中实现ConstraintValidator并给定注解和要校验的类型

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

public class ListValueConstrainValidator implements ConstraintValidator<ListValue,Integer> {
    private Set<Integer> set = new HashSet<>();
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] value = constraintAnnotation.value();
        for (int val : value) {
            set.add(val);
        }
    }
    /**
     * @param integer 需要验证的值
     */

    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {

        return set.contains(integer);
    }
}

 这里的validatedBy是使用哪个校验器,我们自定义的

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Documented
@Constraint(
        validatedBy = {ListValueConstrainValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    String message() default "{com.atguigu.common.valid.ListValue.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
    int[] value() default {};
}
String message() default "{com.atguigu.common.valid.ListValue.message}";这里指一个变量

在resource下建一个ValidationMessages.properties

com.atguigu.common.valid.ListValue.message=必须提交指定值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值