这样的东西。前段时间在做codereview的时候,发现项目中有一个方法,代码很多,而且大部分都是写参数。查代码,各种ifelse,还是先把握需求吧。产品需求查找产品并获取需求文档。要求如下:下载excel数据模板,导入excel数据。导入excel数据时,根据模板的校验规则进行过滤。如果导入成功,则返回成功列表。如果数据有问题,则返回失败列表。FailedList支持数据编辑修复OK。乍一看需求可能有点难看第三列。我们知道传统的数据校验在DTO上的注解如下://第一种publicResulttest(@RequestBody@ValidatedTestDTOdto){...}//第2种publicResulttest(@RequestBody@ValidTestDTOdto{...}//第三种publicResulttest(@RequestBody@Validated(value={SaveGroup.class})TestDTOdto){...}TestDTO会有@NotNull、@NotBlank、@Size等校验注解这里就不一一列举了,然后在全局异常拦截处进行统一封装,让返回的数据结构尽量保持统一,所以一般都要有一个GlobalExceptionHandle来谈公共数据的Check,那么我们改一下样式painting,然后再回来看需求,可以看出上面的需求是不满足的然后做数据判断,放一个集合是合法的,是il合法收藏。而且,即使入参是数组,一旦这种校验不满足,就会马上进入异常处理,无法返回给前端正确的数据结构,所以今天介绍了。这些需求的解决方案。重构开始——一开始,我们以上一篇文章中的一个项目easyexcel-demo为模板,修改编写代码地址:https://github.com/pengziliu/GitHub-code-practice下载我们之前做的小demo,运行,创建工作簿,导入数据,创建Excel数据,PostMan模拟,调用数据分析,项目代码和控制台输出重构开始-实战好了,上面介绍了上一个项目中读取excel的基本功能,我们将基于上述功能来实现我们一开始提到的需求。我们来自定义手机号和姓名的规则:手机号满足基本的手机号规则。名称不能为空且不能超过四个字符。返回两组成功和失败。如果都满意,返回成功。只要有一个不满意,就扔给失败。列表。定义返回的数据结构,新建一个返回对象UserExcelVO.java好了,兄弟们,这里贴出同事写的伪代码。Sitdownandholdon!!!@PostMapping("/importExcel")publicUserExcelVOimportExcel(@RequestParam("file")MultipartFilefile){Listlist=null;Listfail=newArrayList<>();UserExcelVOuserExcelVO=newUserExcelVO();StringmobieReg="^[1][3,4,5,7,8][0-9]{9}$$";try{list=EasyExcel.read(file.getInputStream(),UserExcelModel.class,newModelExcelListener()).sheet().doReadSync();list.forEach(data->{//Processnameverificationif(StringUtils.isEmpty(data.getName())||data.getName().length()>4){fail.add(data);return;}//Processtheverificationofthemobilephonenumberif(StringUtils.isEmpty(data.getMobile())||!data.getMobile().matches(mobieReg)){fail.add(data);return;}//Thefollowingmayhavennumberofif});userExcelVO.setFail(fail);list.removeAll(fail);userExcelVO.setSuccess(list);}catch(IOExceptione){e.printStackTrace();}returnuserExcelVO;}测试数据:用户名年龄手机号性别宝典哥11123847235男宝典哥21215813847236男宝典哥31315813847237男宝典哥41415813847238男宝典哥51515813847239男宝典哥61615813847240男宝典哥717152247241男宝典哥81815813847242男宝典哥91915813847243男宝典哥102015813847244男宝典哥112115813847245男宝典哥122215813847246男宝典哥132315813847247男宝典哥142415813847248男宝典哥152515813847249男测试结果:{"success":[{"cellStyleMap":{},"name":"Baodian2","age":12,"mobile":"15813847236","sex":"Male"},{"cellStyleMap":{},"name":"Baodian3","age":13,"mobile":"15813847237","sex":"Male"},{"cellStyleMap":{},"name":"Baodian4","age":14,"mobile":"15813847238","sex":"Male"},{"cellStyleMap":{},"name":"Baodian5","age":15,"mobile":"15813847239","sex":"Male"},{"cellStyleMap":{},"name":"Baodian6","age":16,"mobile":"15813847240","sex":"Male"},{"cellStyleMap":{},"name":"宝典8","age":18,"mobile":"15813847242","sex":"male"},{"cellStyleMap":{},"name":"宝典9","age":19,"mobile":"15813847243","sex":"男"}],"fail":[{"cellStyleMap":{},"name":"宝典哥1","age":11,"mobile":"23847235","sex":"男"},{"cellStyleMap":{},"name":"宝典哥7","age":17,"mobile":"152247241","sex":"Male"},{"cellStyleMap":{},"name":"宝典10","age":20,"mobile":"15813847244","sex":"male"},{"cellStyleMap":{},"name":"宝典11","age":21,"mobile":"15813847245","sex":"male"},{"cellStyleMap":{},"name":"宝典12","age":22,"mobile":"15813847246","sex":"male"},{"cellStyleMap":{},"name":"宝典13","age":23,"mobile":"15813847247","sex":"男"},{"cellStyleMap":{},"name":"宝典14","age":24"mobile":"15813847248","sex":"男"},{"cellStyleMap":{},"name":"宝典15","age":25,"mobile":"15813847249","sex":"male"}]}根据测试结果,应该问题不大。我这里也是模拟的,但是在实际的业务场景中,如果一个excel中有订单数据,起码有几十个字段开始的,写几十个ifelse显然是不合理的,那么能不能用注解来帮助我们解决这个问题?如果我们使用注解,应该怎么使用呢?创造!创建ValidationUtils.javapublicclassValidationUtils{publicstaticValidatorgetValidator(){returnvalidator;}staticValidatorvalidator;static{ValidatorFactoryvalidatorFactory=Validation.buildDefaultValidatorFactory();validator=validatorFactory.getValidator();}}注解模型并重写控制器@PostMapping("/v2/importExcel")publicUserExcelVOimportExcelV2(@RequestParam("file")MultipartFilefile){Listlist=null;Listfail=newArrayList<>();UserExcelVOuserExcelVO=newUserExcelVO();try{list=EasyExcel.read(file.getInputStream(),UserExcelModel.class,newModelExcelListener()).sheet().doReadSync();list.forEach(data->{//这里3行代码解决一百个ifelseSet>violations=ValidationUtils.getValidator().validate(data);if(violations.size()>0){fail.add(data);}});userExcelVO.setFail(fail);list.removeAll(fail);userExcelVO.setSuccess(list);}catch(IOExceptione){e.printStackTrace();}returnuserExcelVO;}测试同组数据测试结果如下。可以发现两种实现的数据输出结果是一致的{"success":[{"cellStyleMap":{},"name":"宝典阁2","age":12,"mobile":"15813847236“,“性别男&quot;},{"cellStyleMap":{},"name":"宝典3","age":13,"mobile":"15813847237","sex":"男"},{"cellStyleMap":{},"name":"宝典哥4","age":14,"mobile":"15813847238","sex":"男"},{"cellStyleMap":{},"name":"宝典哥5","age":15,"mobile":"15813847239","sex":"男"},{"cellStyleMap":{},"name":"宝典哥6","age":16,"mobile":"15813847240","sex":"Male"},{"cellStyleMap":{},"name":"宝典8","age":18,"mobile":"15813847242","sex":"male"},{"cellStyleMap":{},"name":"宝典9","age":19,"mobile":"15813847243","sex":"male"}],"fail“:[{"cellStyleMap":{},"name":"宝典1","age":11,"mobile":"23847235","sex":"male"},{"cellStyleMap":{},"name":"宝典7","age":17,"mobile":"152247241","sex":"男"},{"cellStyleMap":{},"name":"宝典10","age":20,"mobile":"15813847244","sex":"男"},{"cellStyleMap":{},"name":"宝典11","age":21,"mobile":"15813847245","sex":"男"},{"cellStyleMap":{},"name":"宝典12","age":22,"mobile":"15813847246","sex":"男"},{"cellStyleMap":{},"name":"宝典13","age":23,"mobile":"15813847247","sex":"男"},{"cellStyleMap":{},"name":"宝典14","age":24,"mobile":"15813847248","sex":"male"},{"cellStyleMap":{},"name":"宝典15","age":25,"mobile":"15813847249","sex":"male"}]}代码仓库https://github.com/pengziliu/GitHub-code-practice最新代码提交,欢迎star,里面有很多项目教程和例子。写代码的时候,除了做功能,还要考虑代码的可扩展性。不然产品说要加功能,我们又得重新写代码。悲伤的提醒