您的位置:首页 > 编程语言 > Java开发

[原创]Spring: A Developer's Notebook笔记和小结(18)

2006-03-26 22:40 531 查看
/**
作者:Willpower
来源:Rifoo Technology(http://www.rifoo.com
时间:2006-03-22
备注:转载请保留以上声明
**/

本节主要讨论通知异常(Advising Exceptions)

通常,我们都会将一个service加到异常的逻辑中,而不是加到一般的代码中。当异常改变了应用程序的流程时,这个尤其显得重要。比如当异常发生时的回滚操作,或者当某些资源运行效率很低时自动去通知管理员。

我们的应用程序是为一个小型商店进行山地车的订购管理。当应用程序在使用中发生问题时,我们可以使用Spring的异常来产生一个消息。为了简单起见,我们将把该消息发送到控制台。

我们要做的第一件事情是创建一个advisor。使用一个实现了ThrowsAdvice 接口的简单类来实现,如下例所示:

Example 6-10. ExceptionInterceptor.java
public class ExceptionInterceptor implements ThrowsAdvice {
  public void afterThrowing(Method m, Object[] args,
      Object target, Exception ex) {

    System.out.println("Call to method " + m.getName( ) +
      " on class " + target.getClass( ).getName( ) +
      " resulted in exception of type " + ex.getClass( ).getName( ));
    System.out.println("Exception message: " + ex.getMessage( ));
  }
}


我们要知道ThrowsAdvice接口没有任何方法签名。我们可以实现任何版本的afterThrowing方法。每一个必须声明最后一个参数是Throwable的子类。其他三个参数都是可选的。

在上下文中配置这个advice拦截器的参数。下面,我们来配置advice。注意这里我们又回到了原来的使用ProxyFactoryBean的方式来配置,没有使用上一节讨论到的autoproxy。

Example 6-11. RentABike-servlet.xml
<bean id="exceptionInterceptor"
  class="com.springbook.interceptors.ExceptionInterceptor"/>
<bean id="rentaBike"
  class="org.springframework.aop.framework.ProxyFactoryBean">

  <property name="proxyInterfaces">
    <value>com.springbook.RentABike</value>
  </property>
  <property name="interceptorNames">
    <list>
      <value>exceptionInterceptor</value>
      <value>transactionInterceptor</value>
      <value>saveAdvisor</value>
      <value>rentaBikeTarget</value>
    </list>
  </property>
</bean>


当一个严重的异常发生时,我们可以得到通知。为了确保它是否正确,我们这里尝试删除一个不存在的山地车对象。

Example 6-12. ControllerTest.java
public void testRemoveNonExistentBike( ) throws Exception {
  Bike b = new Bike(99, "me", "mine", 1, "1", 12.00, "good");
  store.deleteBike(b);
}


下面是控制台的输出信息:

Call to method deleteBike on class $Proxy0 resulted in exception of type
org.springframework.orm.hibernate.HibernateSystemException

Exception message: Batch update row count wrong: 0; nested exception is
net.sf.hibernate.HibernateException: Batch update row count wrong: 0


总结:

本节没有什么特别的地方。Spring使用同样的机制和代理来拦截异常逻辑。我们告诉代理将拦截器附加到所有需要update数据库的方法上。在我们的异常逻辑中,我们能够决定做什么。在本例中,我们查看异常并决定哪一个异常对我们来说是重要的。然后我们将一些简单的输出信息输出到控制台上,并返回它所属的控制器:这里,就是facade方法。

下一节我们将讨论Spring的事务和安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息