Java:AspectJ的异常翻译

在这篇博客文章中,我描述了如何使用AspectJ自动将一种异常类型转换为另一种异常类型。

问题

有时,我们处于必须将异常(通常由第三方库引发)转换为另一种异常的情况。 假设您使用的是诸如hibernate之类的持久性框架,并且您不想将hibernate特定的异常泄漏到某个应用程序层之外。 也许您正在使用不止一种持久性技术,并且想将技术特定的异常包装到一个通用的基本异常中。 在这种情况下,可以以如下代码结尾:

public class MyRepository {
  public Object getSomeData() {     
    try {
      // assume hibernate is used to access some data
    } catch(HibernateException e) {
      // wrap hibernate specific exception into a general DataAccessException
      throw new DataAccessException(e);
    }
  }
}

如果每次访问某个框架都必须这样做,那么这当然很丑。

AspectJ方式

AspectJ是Java的面向方面的编程 (AOP)扩展。 使用AspectJ,我们可以定义横切关注点,为我们处理异常转换过程。

首先,我们必须将AspectJ依赖项添加到我们的项目中:

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.7.4</version>
</dependency>

接下来,我们必须为AspectJ设置ajc,编译器和字节码编织器。 此步骤取决于您使用的开发环境,因此在此不再赘述。 Eclipse用户应该查看用于EclipseAspectJ开发工具(AJDT) 。 IntelliJ IDEA用户应确保启用AspectJ插件 。 还有一个AspectJ Maven插件可用(请检查此pom.xml以获取示例配置)。

现在让我们使用AspectJ批注定义方面:

@Aspect
public class ExceptionTranslationAspect {

  @Around("execution(* com.mscharhag.exceptiontranslation.repository..*(..))")
  public Object translateToDataAccessException(ProceedingJoinPoint pjp) throws Throwable {
    try {
      return pjp.proceed();
    } catch (HibernateException e) {
      throw new DataAccessException(e);
    }
  }
}

使用@Aspect批注,我们可以声明一个新的方面。 在这方面,我们使用@Around批注定义一个建议,如果传递的切入点匹配则始终执行该建议。 在这里,切入点

execution(* com.mscharhag.exceptiontranslation.repository..*(..))

每次执行com.mscharhag.exceptiontranslation.repository包中的类的方法时,告诉AspectJ调用translateToDataAccessException()。

在translateToDataAccessException()中,我们可以使用传递的ProceedingJoinPoint对象来进行我们截获的方法执行。 在此示例中,我们仅在方法执行周围添加了一个try / catch块。 使用ProceedingJoinPoint实例,我们还可以做更多有趣的事情,例如使用pjp.getSignature()分析方法签名或使用pjp.getArgs()访问方法参数。

现在,我们可以从上面显示的示例存储库实现中删除try / catch块,并使用简单的测试来验证我们的方面是否正常工作:

public class MyRepositoryTest {

  private MyRepository repository = new MyRepository();

  @Test(expected = DataAccessException.class)
  public void testExceptionTranslation() {
    this.repository.getSomeData();
  }
}

结论

使用AspectJ,我们可以轻松地自动执行Java运行时异常的转换。 通过删除try / catch块,否则将简化异常转换,从而简化了我们的代码。

  • 您可以在GitHub找到示例项目的完整源代码。

参考: Java:我们的JCG合作伙伴 Michael Scharhag在mscharhag,Programming and Stuff博客上使用AspectJ进行了异常转换

翻译自: https://www.javacodegeeks.com/2014/02/java-exception-translation-with-aspectj.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值