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上找到示例项目的完整源代码。
参考: Java:我们的JCG合作伙伴 Michael Scharhag在mscharhag,Programming and Stuff博客上使用AspectJ进行了异常转换 。

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

java aspectj

java aspectj_Java:AspectJ的异常翻译相关推荐

  1. Java:AspectJ的异常翻译

    在这篇博客文章中,我描述了如何使用AspectJ自动将一种异常类型转换为另一种异常类型. 问题 有时,我们处于必须将异常(通常由第三方库引发)转换为另一种异常的情况. 假设您使用的是诸如hiberna ...

  2. et游戏自动翻译工具_ET的异常翻译

    et游戏自动翻译工具 前段时间,我写了一篇有关用AspectJ进行异常转换的小博客文章. 在此博客文章中,我们将看到如何使用ET及其更轻松的Java 8方法来实现相同的目的. 动机 异常转换(或异常转 ...

  3. unchecked异常_为什么要在Java中使用Unchecked异常而不是Checked异常

    unchecked异常 关于检查与未检查的异常的争论可以追溯到过去. 有人说这是Java包含的最佳功能之一. 其他人则说这是他们最大的错误之一[ 1 ]. 辩论似乎结束了. 在这篇文章中,我将尝试包含 ...

  4. Java 7对抑制异常的支持

    在JDK 7中 ,向Throwable类( Exception和Error类的父类)添加了一个新的构造函数和两个新方法. 添加了新的构造函数和两个新方法以支持"抑制的异常"(不要与 ...

  5. 为什么要在Java中使用Unchecked异常而不是Checked异常

    关于检查与未检查的异常的争论可以追溯到过去. 有人说这是Java包含的最佳功能之一. 其他人则说这是他们最大的错误之一[ 1 ]. 辩论似乎结束了. 在这篇文章中,我将尝试包含指向该主题的文章和书籍的 ...

  6. 理解Java里面的必检异常和非必检异常

    问题:理解Java里面的必检异常和非必检异常 Joshua Bloch在"Effective Java"里面说过 在可恢复的条件下和编程错误导致的运行时错误时,使用必检异常(第二版 ...

  7. java中两种异常类型_Java中的三种异常类型

    java中两种异常类型 Errors are the bane of users and programmers alike. Developers obviously don't want thei ...

  8. java在己有的类创子类怎么创_如何使用Java创建自己的异常子类

    Java不知道学了多少课时了,你知道如何使用Java创建自己的异常子类吗,Java的内置异常处理有哪些常见的错误呢,今天IT培训网小编就来给大家详细介绍下吧: 尽管Java的内置异常处理大多数常见错误 ...

  9. 如何优雅地在 Java 8 中处理异常

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Java 8 引入的流 (Stream) API 和 lambda 表达式为我们打开了新世界的大门,自此之后我们也可以在 ...

最新文章

  1. Kubernetes 必备工具:2021
  2. rabbitmq beam.smp cpu利用率过高
  3. cocos2dx游戏开发必备工具之PhysicsEditor【ZT】
  4. 洛谷P1265 公路修建题解
  5. 一个报文的路由器之旅_报文的交换和寻址转发
  6. rtems 4.11 RTC驱动 (arm, beagle)
  7. 使用Azure轻松实现Teams App的全球合规性
  8. 重载和重写以及重写的权限问题
  9. JS获取登录者IP和登录城市
  10. 范例 在 Setting 里加入 HiApk Settings 选项
  11. PowerDesigner(二)-项目和框架矩阵
  12. 我的596升级到Windows Mobile 6了
  13. VRay材质练习(一):水、玻璃、牛奶
  14. (干货,建议收藏)备战2021年软考中级网络工程师-01计算机硬件基础
  15. mysql 父子关系查询_如何让MySQL中单句实现无限层次父子关系查询
  16. 【C语言】之实现三角形类型判断
  17. GoJS学习-节点渐变背景色
  18. Ps钢笔工具抠图、更换背景及边缘优化步骤
  19. bing壁纸获取(Java)
  20. PageAdmin CMS网站制作教程:如何设置会员中心权限?

热门文章

  1. 【模拟】表达式求值(jzoj 1768)
  2. 2014 ACM/ICPC Asia Regional Xi'an Online
  3. 洛谷 P1967货车运输 并查集+贪心 不需要用LCA!
  4. 从零开始用好 Maven : 从 Hello World 到日常使用
  5. 由「Metaspace容量不足触发CMS GC」从而引发的思考
  6. 头条面试题:请谈谈Redis 9种数据结构以及它们的内部编码实现
  7. Spring Boot 配置随机数那些小技巧
  8. Java压缩技术(二) ZIP压缩——Java原生实现
  9. JAVA数据库连接池实现
  10. “小朋友”们节日快乐呀~