JSR 303 and easypoi use cross-validation - validation annotations

Required dependencies:

<!--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 import excel template class:

@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;
}

Template class extension; get an error message, line number, custom JSR cross-validation required fields (fields resolve downtown province, assigned to the corresponding entity, for more entity)

@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;

}

Custom Validator annotations JSR resolve

@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();
    }
}

Since processing method defined JSR annotation validator (implemented)


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;
        }

    }

}

Verify group (effect is unclear, but there is no verification of this information does not take effect)

public interface ViliGroupOne {
}

Test category

@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());
        });
    }

General generic method, call 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;
    }
Published 10 original articles · won praise 2 · Views 9259

Guess you like

Origin blog.csdn.net/VincentLee7/article/details/88718841