在这篇博客文章中,我描述了如何使用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 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的异常翻译相关推荐

  1. java aspectj_Java:AspectJ的异常翻译

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

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

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

  3. java 异常处理发生异常_处理Java中的异常

    java 异常处理发生异常 每个程序员都希望编写一个完美的程序. 也就是说,程序运行时没有任何障碍. 好吧,如果希望是马,乞g就会骑. 除了程序员的所有愿望之外,有时还会发生无法预料的情况. 在Jav ...

  4. java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常

    java 错误输入异常 在我以前的文章中,我写了一篇关于输入验证设计的文章 ,该设计取代了难以维护和测试的 if-else块. 但是,正如某些读者指出的那样,它有一个缺点–如果输入数据有多个验证错误, ...

  5. java开发常见异常_最常见的Java异常及其对Java开发人员的评价

    java开发常见异常 我知道我说过在完成视频之前我不会发帖,但这一直困扰着我. 至于视频的更新,我有些懒散,有些忙碌,但是我已经准备好记录第一集,这是我第一次有机会,而且我不需要太多的编辑. 无论如何 ...

  6. java 8 lambda_异常作弊– Java 8 Lambdas

    java 8 lambda 异常作弊– Java 8 Lambdas 撇开关于Checked vs Runtime异常的宗教辩论,有时由于库的构造不佳,处理Checked示例会使您发疯. 考虑一下您可 ...

  7. 在Java中处理异常

    每个程序员都希望编写一个完美的程序. 也就是说,程序运行时没有任何障碍. 好吧,如果希望是马,乞g就会骑. 除了程序员的所有愿望之外,有时还会发生无法预料的情况. 这些不可预见的情况在Java中通常被 ...

  8. java未检查异常_Java中已检查和未检查的异常

    java未检查异常 Java有两种类型的异常-已检查和未检查. 简而言之,选中的是指开发人员可以从异常中合理恢复的情况,而未选中的异常是无法处理的编程错误. 本文介绍了何时使用哪种. 但这不是那么简单 ...

  9. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

最新文章

  1. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序
  2. Winform中设置ZedGraph的坐标轴的标题和刻度不显示十次幂
  3. Kubernetes入门——深入浅出讲Docker
  4. linux adb 端口,linux 无法连接adb 设备
  5. Python 之父退休,C 语言之父与世长辞,各大编程语言创始人现状大曝光!
  6. 移动互联网这十年,跨平台技术的演进及 Flutter 的未来
  7. loadrunner四大部分
  8. Productivity Power Tools(Visual Studio 扩展) 最新亮点
  9. 汽车启动/停止系统电源方案
  10. 画出清明上河图的代码_【高清】清明上河图(代码)
  11. oracle 币种符号,Oracle用户密码使用特殊符号,例如(AND)、$(Dollar)、#(Pound)、*(Star)等...
  12. 紫川猜想--第二十二卷第六章
  13. a4纸尺寸是多少厘米 a4纸是多少k2022
  14. Filebeat+Kafka+Logstash+ElasticSearch+Kibana搭建完整版
  15. 详解java -jar命令及SpringBoot通过java -jav启动的过程
  16. Git 强制更新覆盖本地代码
  17. python unicode编码转换中文_python实现unicode转中文及转换默认编码的方法
  18. 艾兰岛编辑器-UI面板
  19. 【聆思CSK6 视觉AI开发套件试用】AI控制直流电机转速接口打通
  20. 涂鸦智能 ① tuya-wifi-mcu-sdk-arduino-library 简单剖析

热门文章

  1. OkHttp上传Json嵌套对象
  2. kali mysql停止服务器_MySQL 的主从复制(高级篇)
  3. Java 截取反斜杠--java使用split拆分特殊字符
  4. 本地方法(JNI)——使用调用API
  5. What are definitions of ​Model, Inference and Algorithm and its associations ?
  6. aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
  7. fluent design_Fluent Design单选按钮,复选框,选择框,Java菜单
  8. 变色龙引导_Arquillian变色龙。 简化您的Arquillian测试
  9. java ee 8 api_Java EE 8安全性API:概述
  10. 性能测试流程_流性能