前些天在处理Excel文件导入时,有一个需求,就是将错误行以及错误的列、原因告知,并且不能将之前的内容导入:
分析:
1.批量导入时,出错就返回,并且之前的数据不添加进数据库中,涉及事务的回滚——方法写在Service中,出错了绝对不能简单的return了事;
2.提示出错信息,具体行数,原因——在循环中要结束函数,并且要将信息传递到Controller中;
刚开始做时,想到肯定不能在方法中抛出异常,控制台报错信息真的很难看;
后来想到使用try...catch...配合runtimeexception,因为在Service中单独try异常,会直接在catch块中被处理掉,意味着方法出现异常,但是进行了处理,方法正常执行完,事务并不会回滚,throw同理;
具体做法就是在catch中抛出runtimeexception,但是很快发现,事务进行了回滚,但是因为是运行时异常,而且是在catch块中,所以控制台还是很给面子的刷红了,后来参考另一种说法,自定义异常类继承runtimeexception,把错误提示作为构造方法的参数;但是尝试之后并没有解决问题,而且好像并不需要自定义异常,因为 new RuntimeException("错误信息")是可以通过e.getmessage()来获取错误信息的;
最后,还是找到了解决方法:在service层方法的catch语句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();语句,手动回滚,这样上层就无需去处理异常
注:我还是个年轻人,如有打脸的地方,请轻点打。。。
转载自:https://blog.csdn.net/yipanbo/article/details/46048413