第一个任务遇到的一些问题
在捣鼓了几天的SVN检出项目之后,终于成功把代码从远程代码库下载下来并成功把系统运行起来了。但是由于系统过于庞大,跟了我几年的电脑开始有点不堪重负,CPU跟内存占用都达到了80%,风扇也转的很大声,赶紧叫来了标哥,在tomcat的配置文件那里加了一句:
-Xms2048m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m
问题终于迎刃而解。
于是也就迎来了在公司的第一个任务:
熊奉标 10:56:41局内业务批量受理校验功能,如果导入的字段值有空格,则系统校验不通过,提示机房或者设施不存在。因此,要去系统优化功能,能自动去除字段值前后的空格后再进行校验。案例见附件
这个任务的需求也就是在局内业务批量受理校验功能中,用户从系统导出excel模板,对着模板填充对应的信息。但是由于用户有时候会误操作,或者输入的时候会填充多一些空格在文字的前后,此时系统校验功能就会出错,自动读取空格为某一列,然后导致错位,提示机房或者设施不存在。所以需要在系统原有的基础上进行优化,能自动去除字段值前后的空格后再进行校验。
由于我的excel是2016版本,如果单元格没有设置为文本格式的话,是没有办法直接在文字前面或者后面直接添加空格,因为excel会自动去除空格,2010版本则没有这个问题。下面则列出我的部分测试数据(高亮部分为特殊测试数据,在数字的前后分别加入空格):
(必填) | 无需填 | 无需填 | 无需填 | (二选一必填) | 无需填 | 无需填 | (二选一必填) | ||||
---|---|---|---|---|---|---|---|---|---|---|---|
接入网类型 | 光纤类型 | 纤芯数量 | A端机房区域 | A端机房 | A端网元名称 | A端端口位置 | A端设备种类 | B端机房区域 | B端机房 | B端网元名称 | B端端口位置 |
FTTH,FTTO,FTTB+DSL,FTTB+LAN | OLT,1D-OBD,2D-OBD,ONU | ||||||||||
超出字典值范围时提示提示“无此光路类型” | 默认值:单模 | 默认值:单纤 | 由光交设施或机房生成 | 1、已填写但不存在,提示:A端机房名称不存在; 2、未填写:由A端网元名称生成 | 1、已填写但不存在,提示:A端网元名称不存在; | 当不存在,提示:A端端子不存在;当无空闲,提示:A端端子非空闲。 | 当有填写时校验字典值范围。 当无填写时,由A端网元名称生成 | 由光交设施或机房生成 | 1、已填写但不存在,提示:B端机房名称不存在; 2、未填写:由B端网元名称生成 | 1、已填写但不存在,提示:B端网元名称不存在; | 当不存在,提示:B端端子不存在;当无空闲,提示:B端端子非空闲。 |
FTTH | 11 | 11 | 1 | 2 | 2 | 2 |
在看了好久的源代码之后,终于开始着手写代码了。首先找到了
在该源文件中添加了如下代码:
public static String getStringWithoutSpace(String str){ String str1 = str.replaceAll(" ", ""); return str1; }
ctrl + S保存,再找到如下文件:
在源代码中:
//由于所有excel表格数据都是获取到mapmo对象中 for (int j = 0; j < loopCount; j++) { List<Map<String, String>> list = getDatasByPage(fileparse, j, 0); for (int k = 0; k < list.size(); k++) { Map<String, String> mapmo = list.get(k); } //所以我就在想只要在每次mapmo对象获取key对应的value值时,对获得的String字符串进行去空格处理,如下所示: String fiberMainState = mapmo.get("CUS_NOTNULL_FIBERMAINSTATE"); -> String fiberMainState = InventoryUtil.getStringWithoutSpace(mapmo.get("CUS_NOTNULL_FIBERMAINSTATE")); //对OrderVerifyImportProcessor.java文件中所有相应部位都加上InventoryUtil.getStringWithoutSpace()处理。对读取的String进行去空格处理。
Ctrl + S保存,右键tomcat->debug运行,导入测试文件进行测试,然后弹出如下空指针异常:
这一下子就有点懵逼了,于是开始苦逼的debug断点调试,F5,F6旋转跳跃不停歇。
终于在一处地方看到了端倪:
String fiberMainState = InventoryUtil.getStringWithoutSpace(mapmo.get("CUS_NOTNULL_FIBERMAINSTATE")); //当mapmo获取对应的value时,如果该value值本身为null,而上述的去空格代码没有进行判空处理,就会出现空指针异常。 //于是将代码改成如下: public static String getStringWithoutSpace(String str) { if(str != null) { String str1 = str.trim(); return str1; } return str; }
此时再次运行系统就没有再出现空指针异常。
然后成功导入用户的检验文件,输出校验结果文件:
校验成功码: | |||||||||
---|---|---|---|---|---|---|---|---|---|
接入网光路(深圳)-订购 | |||||||||
接入网类型 | 光纤类型 | 纤芯数量 | A端机房区域 | A端机房 | A端网元名称 | A端端口位置 | A端设备种类 | B端机房区域 | B端机房 |
FTTH | 海珠 | 11 | 11 | 1 | 黄埔 | 2 |
RESULT文件并没有将空格去除,但是在读取文件的时候空格明明已经去除了,我就在想可能是因为在读取excel文件时去除空格,只是存在于内存中,而在生成RESULT文件时没有将空格去除,所以还是有空格。
于是我又找到了生成RESULT文件的方法,对其进行修改:
private void createExcelFileManySheet(OutputStream out, String[] dataTitles, List<Map<String, String>> dataList,HSSFRichTextString[] cellComment,String metaClassName,String verifyCode) { WritableWorkbook workbook; WritableCellFeatures wcfeatures = null; try { workbook = Workbook.createWorkbook(out); WritableSheet sheet = workbook.createSheet("sheet1",0); NetworkTemplateUtil.initialSheetSetting(sheet); verifyCode = "校验成功码:"+(verifyCode==null?"":verifyCode); String productName = NetworkTemplateUtil.templateNameMaps.get(metaClassName); sheet.addCell(new Label(0, 0, verifyCode)); sheet.addCell(new Label(0, 1, productName)); Label label; for (int j = 0; j < dataTitles.length; j++){ label = new Label(j, 2, dataTitles[j]); wcfeatures = new WritableCellFeatures(); wcfeatures.setComment(cellComment[j].toString()); label.setCellFeatures(wcfeatures); sheet.addCell(label); } for (int row=0; row<dataList.size(); row++) { Map<String , String > maps = dataList.get(row); for (int n = 0; n < dataTitles.length ; n++) { Cell cells = sheet.getCell(n, 2); String str = cells.getCellFeatures().getComment(); label = new Label(n, row + 3, InventoryUtil.getStringWithoutSpace(maps.get(str)); //在此处加入去空格处理,所以写入RESULT文件时就会没有空格 sheet.addCell(label); } } workbook.write(); workbook.close(); } catch (SocketException s) { s.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (WriteException e) { e.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } }
事情到这个阶段就告一段落,成功运行系统,导出正确的RESULT文件,看到想要的结果,超级开心地叫来了标哥,在看了代码以后标哥给了个建议:
这样改的话,可能需要改动的地方太多了,每一处有用到mapmo获取的地方都需要加入去空格处理,工程量太大,看看能不能在一开始获取excel表数据的源头那里就直接对数据进行处理,这样以后就不用每次都处理。
然后我就找到了一开始读取excel表的方法:
public List<Map<String, String>> parse(int begin, int end, int sheetIndex) { XSSFSheet sheet = sheets.get(sheetIndex); if(sheet == null){ return null; } List<String> keyList = sheetsKeyList.get(sheetIndex); List<Map<String, String>> excelList = new ArrayList<Map<String, String>>(); int startCol = 0; if(commentRow==3) startCol=1; for (int row = begin; row <= end; row++) { Map<String, String> map = new HashMap<String, String>(); if (sheet.getRow(row) != null) { for (int i = 0; i < keyList.size(); i++) { String key = keyList.get(i); String value = getCellValue(sheet, row, i+startCol); //在这里加入去空格处理: String value = InventoryUtil.getStringWithoutSpace(getCellValue(sheet, row, i+startCol)); map.put(key, value); } if (map.size() > 0) { excelList.add(map); } } else { map.put(null, null); excelList.add(map); } } return excelList; }
去除其他地方的去空格处理,运行系统,得到了想要的效果。把标哥叫来了,标哥看了下这个parse方法,发现有两三处地方都调用了这个方法,改动了这个方法后这样子就有可能影响了其他地方的功能。所以再次给出了另外一个建议:
既然所有的数据都是先获取到mapmo对象中,那可不可以考虑在获取mapmp后直接对其进行处理,然后再开始对它进行调用。
//由于所有excel表格数据都是获取到mapmo对象中for (int j = 0; j < loopCount; j++) {
List<Map<String, String>> list = getDatasByPage(fileparse, j, 0); for (int k = 0; k < list.size(); k++) { Map<String, String> mapmo = list.get(k); }
考虑了一下以后,在OrderVerifyImportProcessor.java文件中编写一个新的方法,对mapmo对象进行去空格处理:
private void getMapmoWithoutSpace(Map<String, String> mapmo) { if (mapmo == null) return; Set<String> keys = mapmo.keySet(); for (String key : keys) { String value = mapmo.get(key); value = InventoryUtil.getStringWithoutSpace(value); mapmo.put(key, value); } }
运行系统,终于大功告成,第一个任务顺利完成,终于也能在公司提交自己写的代码了,也是很有成就感。
接下来就是将自己的代码同步到远程SVN仓库:
点击Team Synchronizing视图:
点击Synchronize:
选择SVN:
可以直接选取工作空间,也可以选择工作集,然后可以创建自己的工作集,这样就不用每次都再全部同步:
成功同步后,点击以下按钮:
查看svn代码库与本地代码库不同的文件,然后全选那些不同的文件,右键->更新,先对本地代码进行更新。
然后点击如下按钮:
经过与SVN代码库的代码对比,找出做出的修改,尽量做到只提交必要的修改:
然后右键对应的文件->提交:
此处需要用到PMS帐号,由于我还没有申请PMS帐号,所以就先写到这里。
终于等到了PMS帐号,可以为公司提交代码啦,刚注册了PMS帐号,就发现自己头上有两个bug任务:
接下来让我们来提交第一个bug的解决方案:
选择需要提交的代码,此处不能选择全部提交,只需要提交改动的java文件即可:
添加上对应的PMS,点击OK即可。
接下来就是欣赏自己的成果了:
第一个任务到此就顺利完成啦~