java aspectj
在这篇博客文章中,我描述了如何使用AspectJ自动将一种异常类型转换为另一种异常类型。
问题
有时,我们处于必须将异常(通常由第三方库引发)转换为另一种异常的情况。 假设您正在使用像hibernate这样的持久性框架,并且不想将特定于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 DataAccessExceptionthrow 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用户应该查看用于Eclipse的AspectJ开发工具(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上找到示例项目的完整源代码。
翻译自: https://www.javacodegeeks.com/2014/02/java-exception-translation-with-aspectj.html
java aspectj