JSR 303交叉验证以及easypoi使用--注解验证

所需依赖:

<!--easypoi-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.0.0</version>
        </dependency>
<!--MVEL处理依赖-->
		<dependency>
            <groupId>org.mvel</groupId>
            <artifactId>mvel2</artifactId>
            <version>2.0.19</version>
        </dependency>

easypoi导入excel模板类:

@Data
public class Order implements Serializable {
    @Excel(name = "寄件人姓名")
    @NotNull(message = "寄件人姓名不能为空" ,groups = {ViliGroupOne.class})
    private String senderName;
    @Excel(name = "寄件人联系方式")
    @NotNull(message = "寄件人联系方式不能为空" ,groups = {ViliGroupOne.class})
    @IsMobile(message = "寄件人联系方式输入错误", groups = {ViliGroupOne.class})
    private String senderPhone;
    @Excel(name = "寄件人省市区")
    @NotNull(message = "寄件人省市区不能为空" ,groups = {ViliGroupOne.class})
    private String senderProvinces;

    @Excel(name = "收件人姓名")
    @NotNull(message = "收件人姓名不能为空" ,groups = {ViliGroupOne.class})
    private String receiverName;
    @Excel(name = "收件人联系方式")
    @NotNull(message = "收件人联系方式不能为空" ,groups = {ViliGroupOne.class})
    @IsMobile(message = "收件人联系方式输入错误", groups = {ViliGroupOne.class})
    private String receiverPhone;
    @Excel(name = "收件人省市区")
    @NotNull(message = "收件人省市区不能为空" ,groups = {ViliGroupOne.class})
    private String receiverProvinces;
}

模板类扩展;获取错误信息,行号,自定义JSR交叉验证所需字段(解析省市区字段,给对应实体进行赋值,获取详细实体)

@Data
@ParseProvinces.List({
        @ParseProvinces(provinces = "senderProvinces", provincesVo = "senderProvincesVo", message = "寄件人省市区解析失败,请按要求填写", groups = {ViliGroupOne.class}),
        @ParseProvinces(provinces = "receiverProvinces", provincesVo = "receiverProvincesVo", message = "收件人省市区解析失败,请按要求填写", groups = {ViliGroupOne.class})
})
public class OrderOfMode extends Order implements IExcelModel, IExcelDataModel {
    private String errorMsg;
    private int rowNum;

    private ProvincesVo senderProvincesVo;
    private ProvincesVo receiverProvincesVo;

}

自定义JSR解析注解验证器

@Target({TYPE, METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {ParseProvincesValidator.class})
public @interface ParseProvinces {
    boolean required() default true;

    String message() default "";

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

    Class<? extends Payload>[] payload() default {};

    String provinces();

    String provincesVo();

    @Target({TYPE, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @interface List
    {
        ParseProvinces[] value();
    }
}

自定义JSR注解验证器的处理方法(实现)


public class ParseProvincesValidator implements ConstraintValidator<ParseProvinces, Object> {
    String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)"
            + "(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)"
            + "(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
    private String provinces;
    private String provincesVo;

    private boolean required = false;

    @Override
    public void initialize(ParseProvinces constraintAnnotation) {
        this.provinces = constraintAnnotation.provinces();
        this.provincesVo = constraintAnnotation.provincesVo();
        required = constraintAnnotation.required();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        Object provincesObj = MVEL.getProperty(provinces, value);
        Object provincesVoObj = MVEL.getProperty(provincesVo, value);

        if (required) {
            return parseProvinces(value);
        } else {
            if (value == null) {
                return true;
            } else {
                return parseProvinces(value);
            }
        }
    }

    private boolean parseProvinces(Object param) {
		//解析,执行所需操作
		//dosomthing
        Object provincesObj = MVEL.getProperty(provinces, param);
        String province = null;
        String city = null;
        String county = null;
        Matcher m = Pattern.compile(regex).matcher(provincesObj.toString());
        while (m.find()) {
            province = m.group("province");
            city = m.group("city");
            county = m.group("county");
        }
        LibArea libAreaProvice = null;
        LibArea libAreaCity = null;
        LibArea libAreaCounty = null;
        if (province != null && city != null && county != null) {
            if (province.contains("上海") || province.contains("北京")
                    || province.contains("天津") || province.contains("重庆")) {
                province = province.substring(0, province.indexOf("市"));
            }
            province = province.trim();
            city = city.trim();
            county = county.trim();
            libAreaProvice = LocalCache.get(province, 1, 100000);
            if (libAreaProvice != null) {
                libAreaCity = LocalCache.get(city, 2, libAreaProvice.getId());
                if (libAreaCity != null) {
                    libAreaCounty = LocalCache.get(county, 3, libAreaCity.getId());
                }
            }
        }
        if (libAreaProvice != null && libAreaCity != null && libAreaCounty != null) {
            ProvincesVo p = new ProvincesVo();
            p.setProvince(libAreaProvice.getName());
            p.setProvinceId(libAreaProvice.getId());
            p.setCity(libAreaCity.getName());
            p.setCityId(libAreaCity.getId());
            p.setCounty(libAreaCounty.getName());
            p.setCountyId(libAreaCounty.getId());
            MVEL.setProperty(param, provincesVo, p);
            return true;
        } else {
            return false;
        }

    }

}

验证分组(作用还不清楚,不过没有这个验证信息不生效)

public interface ViliGroupOne {
}

测试类

@Test
    public void importVerifyTestByOrder() {
        String filePath = "E:\\Work\\Ksudi\\Soms\\template\\ORDER_TEMPLATE.xls";
        ExcelImportResult<OrderOfMode> result = EasyPoiUtil.importExcelVerify(filePath, OrderOfMode.class, new Class[]{ViliGroupOne.class});
        List<OrderOfMode> list = result.getList();
        List<OrderOfMode> failList = result.getFailList();
        list.forEach(success -> {
            System.out.println("成功数据:" + success.toString());
        });
        failList.forEach(fail -> {
            System.out.println("失败信息:" + fail.toString());
        });
    }

通用泛型方法,调用easypoi

public static <T> ExcelImportResult<T> importExcelVerify(String filePath, Class<T> pojoClass, Class<T>[] verifyClass) {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setNeedVerify(true);
        params.setVerifyGroup(verifyClass);
        ExcelImportResult<T> result = null;
        try {
            result = ExcelImportUtil.importExcelMore(new File(filePath), pojoClass, params);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return result;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值