统一异常处理
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);
}

浙公网安备 33010602011771号