统一异常处理
1.在jsp阶段,web.xml中,提供了error-page的写法,当发生指定异常的时候,指定跳转页面:
<error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> <error-page> <exception-type>cn.sz.gl.util.MoneyLessException</exception-type> <location>/error.jsp</location> </error-page>
2.在spring中,也提供了一些异常处理的方式:
a. 通过@ExceptionHandler注解,来指定异常发生时需要完成的操作;
这种方式,只局限于注解所在的类中生效;
为了能在所有控制器类中应用,可以写一个父类,添加@ExceptionHandler注解,然后让所有控制器类继承该父类;
b. 借助于spring提供的SimpleMappingExceptionResolver异常处理类,完成异常配置
c. 也可以自己来创建自己的异常处理类,实现HandlerExceptionResolver接口
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 发生异常时,默认跳转的页面 <property name="defaultErrorView" value="error_simple" ></property> 异常发生时,保存错误信息的对象的名字,默认叫做exception <property name="exceptionAttribute" value="ex" ></property> <property name="exceptionMappings" > <props> <prop key="cn.sz.gl.util.MoneyLessException" >error_simple</prop> </props> </property> </bean>
@Transactional(isolation=Isolation.READ_COMMITTED,propagation=Propagation.REQUIRED,rollbackFor= {AccountLessException.class,MoneyLessException.class})(事务) @Override public void inventoryReductionAndReduceBalance(Integer bookid,Integer accid) { //减库存数量 storehousemapper.inventoryReduction(bookid); //查询库存 Integer count = storehousemapper.findStorehouse(bookid); System.out.println("count:=================="+count); if(count<=0) { throw new AccountLessException("库存不足"); } //减余额 Account account = new Account(); account.setAccid(accid); //这里需要查询现在的余额和书籍的价格 //查询账户余额 Double oldBalance = accountmapper.findBalance(accid); //查询书籍信息 Book book = bookmapper.findByIdBook(bookid); //获取书籍的价格 Double bookPrice = book.getBookPrice(); //减去书籍价格后新的余额 Double balance = oldBalance-bookPrice; if(balance<0) { throw new MoneyLessException("余额不足"); } account.setBalance(balance); accountmapper.reduceBalance(account); }