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 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的异常翻译相关推荐
- java aspectj_Java:AspectJ的异常翻译
java aspectj 在这篇博客文章中,我描述了如何使用AspectJ自动将一种异常类型转换为另一种异常类型. 问题 有时,我们处于必须将异常(通常由第三方库引发)转换为另一种异常的情况. 假设您 ...
- et游戏自动翻译工具_ET的异常翻译
et游戏自动翻译工具 前段时间,我写了一篇有关用AspectJ进行异常转换的小博客文章. 在此博客文章中,我们将看到如何使用ET及其更轻松的Java 8方法来实现相同的目的. 动机 异常转换(或异常转 ...
- java 异常处理发生异常_处理Java中的异常
java 异常处理发生异常 每个程序员都希望编写一个完美的程序. 也就是说,程序运行时没有任何障碍. 好吧,如果希望是马,乞g就会骑. 除了程序员的所有愿望之外,有时还会发生无法预料的情况. 在Jav ...
- java 错误输入异常_在Java中进行输入验证期间用错误通知替换异常
java 错误输入异常 在我以前的文章中,我写了一篇关于输入验证设计的文章 ,该设计取代了难以维护和测试的 if-else块. 但是,正如某些读者指出的那样,它有一个缺点–如果输入数据有多个验证错误, ...
- java开发常见异常_最常见的Java异常及其对Java开发人员的评价
java开发常见异常 我知道我说过在完成视频之前我不会发帖,但这一直困扰着我. 至于视频的更新,我有些懒散,有些忙碌,但是我已经准备好记录第一集,这是我第一次有机会,而且我不需要太多的编辑. 无论如何 ...
- java 8 lambda_异常作弊– Java 8 Lambdas
java 8 lambda 异常作弊– Java 8 Lambdas 撇开关于Checked vs Runtime异常的宗教辩论,有时由于库的构造不佳,处理Checked示例会使您发疯. 考虑一下您可 ...
- 在Java中处理异常
每个程序员都希望编写一个完美的程序. 也就是说,程序运行时没有任何障碍. 好吧,如果希望是马,乞g就会骑. 除了程序员的所有愿望之外,有时还会发生无法预料的情况. 这些不可预见的情况在Java中通常被 ...
- java未检查异常_Java中已检查和未检查的异常
java未检查异常 Java有两种类型的异常-已检查和未检查. 简而言之,选中的是指开发人员可以从异常中合理恢复的情况,而未选中的异常是无法处理的编程错误. 本文介绍了何时使用哪种. 但这不是那么简单 ...
- java 异常处理发生异常_Java中的异常处理
java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...
最新文章
- 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序
- Winform中设置ZedGraph的坐标轴的标题和刻度不显示十次幂
- Kubernetes入门——深入浅出讲Docker
- linux adb 端口,linux 无法连接adb 设备
- Python 之父退休,C 语言之父与世长辞,各大编程语言创始人现状大曝光!
- 移动互联网这十年,跨平台技术的演进及 Flutter 的未来
- loadrunner四大部分
- Productivity Power Tools(Visual Studio 扩展) 最新亮点
- 汽车启动/停止系统电源方案
- 画出清明上河图的代码_【高清】清明上河图(代码)
- oracle 币种符号,Oracle用户密码使用特殊符号,例如(AND)、$(Dollar)、#(Pound)、*(Star)等...
- 紫川猜想--第二十二卷第六章
- a4纸尺寸是多少厘米 a4纸是多少k2022
- Filebeat+Kafka+Logstash+ElasticSearch+Kibana搭建完整版
- 详解java -jar命令及SpringBoot通过java -jav启动的过程
- Git 强制更新覆盖本地代码
- python unicode编码转换中文_python实现unicode转中文及转换默认编码的方法
- 艾兰岛编辑器-UI面板
- 【聆思CSK6 视觉AI开发套件试用】AI控制直流电机转速接口打通
- 涂鸦智能 ① tuya-wifi-mcu-sdk-arduino-library 简单剖析
热门文章
- OkHttp上传Json嵌套对象
- kali mysql停止服务器_MySQL 的主从复制(高级篇)
- Java 截取反斜杠--java使用split拆分特殊字符
- 本地方法(JNI)——使用调用API
- What are definitions of ​Model, Inference and Algorithm and its associations ?
- aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
- fluent design_Fluent Design单选按钮,复选框,选择框,Java菜单
- 变色龙引导_Arquillian变色龙。 简化您的Arquillian测试
- java ee 8 api_Java EE 8安全性API:概述
- 性能测试流程_流性能