问题
我们支持文件校验、题头校验、列校验等,规则已经多样化,已经覆盖了绝大多数场景,但是难免有一些个性化的校验需要与业务挂钩,这种该怎么办呢?每次都需要在jcsv组件中加规则?这个很容易导致规则越来越多,越来越难以维护。
jcsv导入动态扩展思路
导入配置如下:
csv-config:
importc:
- id: aa
desc: "通用上传"
max-size: 30 #单位m
separator: ","
start-row: 2
col-from-header: true
check-column-size: false
header-validcate: throngBaseTdHeaderValidator
valicate:
- { col: 0, name: email,required: true,validateRegex: "^[é?à?ù??èíá?N?Uó?ú??ü?àèù????áéàê?í???ü??à??èéê?????ù?ü??????????????????A-Za-z0-9_\-\.\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$", hint: "邮箱地址错误"}
- { col: 1, name: language ,required: true,hint: "语言错误" ,validator: throngBaseTdValidator ,td-id: 11}
- { col: 2, name: site_id,required: true,hint: "站点错误" ,validator: throngBaseTdValidator ,td-id: 13}
- { col: 4, name: member_id,validateRegex: "^\d{1,10}$", hint: "请填写10位以内的数字",required: true}
- { col: 0, name: device_id,required: true}
这里我们就需要设计一个接口来支持动态扩展,这里就是使用策略模式来进行动态扩展,规则可替换。
1、我们先定义一个动态的题头校验规则以及一个列校验规则 如下:
public interface HeaderValidator {
public boolean validcate(String[] headerStrs, List
}
@FunctionalInterface
public interface Validator {
public boolean validcate(String value, ColValidcateProperties col, String[] row, Object params);
}
个性化规则需要实现上面的两个接口 参考上面的配置参数 importc.header-validcate 与importc.valicate[0].valicate 这里有两种方式,1、bean交给spring托管,配置beanName,2、配置类全路径,通过class.forName来实例化对象,实例化的对象交给ValidcateFactory来进行管理。 这里我们是采用方案1,下面是组件中相关伪代码
for (int i = 0; i < colValues.length; i++) {
//上面若干代码省略
if (StringUtils.isNotBlank(v.getValidator())) {
Validator validator = (Validator) SpringContext.getSingleton().getBean(v.getValidator());
if (validator != null && !validator.validcate(colValues[i].trim(), v, colValues, request.getParams())) {
sb.append(errorRow + v.getName() + v.getHint()).append(enterLine);
bFlag=false;
continue;
}
}
//下面若干代码省略
}
下面给一个详细实例来校验:我们需要根据数据库中的字典来校验规则,如下
@Service("aaValidator")
public class AAValidator implements Validator {
private ConcurrentHashMap
@Autowired
private DemoMapperdemoMapper;
@Override
public boolean validcate(String value, ColValidcateProperties v, String[] row, Object params) {
int product=0;
if(params!=null){
product=Integer.parseInt(params.toString());
}
List
if("language".equals(v.getName())){
values=getTdList("11",product);
}else if("site_id".equals(v.getName())){
values=getTdList("13",product);
}
if(values!=null&&values.size()>0&&!values.contains(value)){
return false;
}
return true;
}
public List
List
return list;
}
}
然后配置列如下:
- { col: 1, name: language ,required: true,hint: "语言错误" ,validator: aaValidator}
jcsv导出动态扩展
下面也介绍下导出动态扩展,这里提供了一个分页接口,如下:
public interface Paging {
public List
上一篇 Java计算工作日的工具