实体类字段校验麻烦?自定义注解帮你校验

  1. 创建一个注解
package com.atguigu.common.annotation;

import com.atguigu.common.annotation.validated.YgqListValueValidated;

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

//表示这个是元注解
@Documented
//注解校验器类
@Constraint(validatedBy = {YgqListValueValidated.class})
//作用域,表示在方法,字段,类以及其他地方才可以表示这个注解
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
//标识运行时注解 始终不会丢弃,运行期也保留该注
@Retention(RetentionPolicy.RUNTIME)
public @interface YgqListValue {
//表示默认值,我们可以在ValidationMessages.properties里面配置,见下文
    String message() default "{com.atguigu.common.annotation.YgqListValue.message}";
	//支持分组
    Class<?>[] groups() default {};
	//payload 负载
    Class<? extends Payload>[] payload() default {};
	//定义一个数字参数,用于校验指定得数字
    int[] vals() default {};

}
  1. 我们可以在resources里面创建ValidationMessages来配置message默认值
    在这里插入图片描述
  2. 定义校验器,校验值
package com.atguigu.common.annotation.validated;

import com.atguigu.common.annotation.YgqListValue;
import org.springframework.validation.annotation.Validated;

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

public class YgqListValueValidated implements ConstraintValidator<YgqListValue, Integer> {
    private HashSet<Integer> set = new HashSet<>();

    //校验器初始化
    @Override
    public void initialize(YgqListValue constraintAnnotation) {
        //将我们指定得值全部放到set集合里面
        int[] vals = constraintAnnotation.vals();
        for (int val : vals) {
            set.add(val);
        }
    }

    //校验结果
    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        //integer就是我们实体类得值,跟我们定义注解时指定得值作比较,如果包含那就返回true,不包含就抛出异常,返回message
        return set.contains(integer);
    }
}
  1. 定义自定义异常,方便统一返回指定错误json
package com.atguigu.gulimall.product.exception;

import com.atguigu.common.exception.HttpCode;
import com.atguigu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;

/*
自定义异常类
 */
@Slf4j
@RestControllerAdvice
public class GulimallExceptionControllerAdvice {
    //自定义实体类字段校验拦截器 (MethodArgumentNotValidException是自定义字段异常类)
    @ExceptionHandler(value = org.springframework.web.bind.MethodArgumentNotValidException.class)
    public R handleVaildException(org.springframework.web.bind.MethodArgumentNotValidException e){
        HashMap<String, String> errMap = new HashMap<>();
        //取方法字段校验有问题得字段集合,一个一个把他们放到map中,返回给前端
        BindingResult bindingResult = e.getBindingResult();
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            errMap.put(fieldError.getField(),fieldError.getDefaultMessage());
        }
        return R.error(HttpCode.FIELD_NONCOMPLIANCE.getCode(),HttpCode.FIELD_NONCOMPLIANCE.getMessage()).put("data",errMap);
    }


    //没有拦截得全部处理
    @ExceptionHandler(value = Exception.class)
    public R handleException(Exception e){
        log.error(e.getMessage(),e.getClass());
        return R.error(HttpCode.UNKNOW_EXCEPTION.getCode(),HttpCode.UNKNOW_EXCEPTION.getMessage());
    }
}
  1. 使用@YgqListValue 注解,vals就是指定0,1如果传递进来showStatus是0或者1,那么就校验通过,否则就返回异常给前端,
	@Data
	@TableName("pms_brand")
	public class BrandEntity implements Serializable {
		private static final long serialVersionUID = 1L;
		/**
		 * 显示状态[0-不显示;1-显示]
		 */
		@YgqListValue(vals={0,1})
		private Integer showStatus;
	}
  1. controller
    /**
     * 保存
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:brand:save")
    public R save(@Valid @RequestBody BrandEntity brand){
		brandService.save(brand);
        return R.ok();
    }
  1. 结果
    传递3就报错异常,会被我们自定义注解校验
    在这里插入图片描述
    传递0或者1,就通过我能自定义注解校验成功
    在这里插入图片描述
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Excel2Entity Excel2Entity实现了Java POI对xls文件的读取功能的封装,实现了批量导入Excel中的数据时自动根据Excel中的数据行创建对应的Java POJO实体对象的功能。 该类库也实现了在创建实体对象时对字段类型进行校验,可以对Excel中的数据类型合法性进行校验,通过实现扩展接口,可以实现自定义校验规则以及自定义实体对象字段类型等更加复杂的校验规则和字段类型转换。 应用场景 该类库主要用应用场景是在一般管理系统中批量数据导入。 安装配置 Excel2Entity类库已经加入到Maven中央仓库,如果你的项目使用了Maven,则可以通过添加下面的Maven依赖配置项将该类库加入到您的项目. cc.aicode.java.e2e ExcelToEntity 1.0.0.3 依赖 Excel2Entity依赖于Apache POI类库。 使用说明 使用示例请参考src/test/java/cc/aicode/e2e/Excel2Entity/AppTest测试用例。 普通实体创建 ExcelHelper eh = ExcelHelper.readExcel("111.xls"); List entitys = null; try { entitys = eh.toEntitys(Demo.class); for (Demo d : entitys) { System.out.println(d.toString()); } } catch (ExcelParseException e) { System.out.println(e.getMessage()); } catch (ExcelContentInvalidException e) { System.out.println(e.getMessage()); } catch (ExcelRegexpValidFailedException e) { System.out.println(e.getMessage()); } 注册新的字段类型 注册的新的字段类型类必须实现ExcelType抽象类。 ExcelHelper.registerNewType(MyDataType.class); 实体对象 实体类必须标注@ExcelEntity注解, 同时需要填充的字段标注@ExcelProperty注解 @ExcelEntity public class Demo { @ExcelProperty(value="Name", rule=MyStringCheckRule.class) private String name; @ExcelProperty("Sex") private String sex; // 基于正则表达式的字段校验 @ExcelProperty(value="Age", regexp="^[1-4]{1}[0-9]{1}$", regexpErrorMessage="年龄必须在10-49岁之间") private int age; @ExcelProperty(value="Tel") private Long tel; @ExcelProperty("创建时间") private Timestamp createDate; @ExcelProperty(value="Name", required=true) private MyDataType name2; ... [get/set方法] } 自定义校验规则 自定义校验规则必须实现ExcelRule接口 public class MyStringCheckRule implements ExcelRule { // 字段检查 public void check(Object value, String columnNam

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值