java aspectj_Java:AspectJ的异常翻译

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql5.6.33安装教程_Linux下mysql5.6.33安装配置教程

本教程为大家分享了mysql5.6.33在linux下的安装配置方法&#xff0c;供大家参考&#xff0c;具体内容如下1、下载下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/5.6.html#downloads下载版本&#xff1a;我这里选择的5.6.33&#xff0c;通用版&#xff0c;linux下6…

【渝粤教育】广东开放大学 劳动关系理论与实务 形成性考核 (1)

选择题 题目&#xff1a; 劳动关系的主体是&#xff08; &#xff09;。 答案&#xff1a;看左侧 题目&#xff1a; 主要研究企业对员工的管理政策、策略和实践的学派被称为&#xff08; &#xff09;。 答案&#xff1a;看左侧 题目&#xff1a; 工会以&#xff08;…

【渝粤教育】广东开放大学 土木工程测量 形成性考核 (45)

选择题 题目&#xff1a;地面点沿法线方向至参考椭球面的距离称为该点的&#xff08;&#xff09; 题目&#xff1a;地面点沿铅垂线方向至大地水准面的距离称为该点的&#xff08;&#xff09; 题目&#xff1a;我国目前采用的高程基准是 题目&#xff1a;象限角的取值范围 题目…

基于表达式的访问控制

1.概述 今天&#xff0c;我们将回顾基于表达式的访问控制&#xff08;EBAC&#xff09;&#xff0c;基于角色的访问控制&#xff08;RBAC&#xff09;和基于属性的访问控制&#xff08;ABAC&#xff09;之间的区别&#xff0c;并将重点放在EBAC上。 2.什么是基于表达式的访问控…

excel数据命令导入mysql_如何将EXCEL数据导入MYSQL

VBA对MySql数据库进行读取和写入操作时间:2009-10-06 09:18:47来源:网络 作者:未知 点击:178次以下代码用于32位系统,Office 2003,环境,MySql版本5.1在使用前需要先安装MySql的驱动&#xff0c;进行正确配置注意&#xff1a;必须给出正确的服务器名、数据库名、表名、数据库连接…

【渝粤教育】广东开放大学 工程力学 形成性考核 (27)

选择题 题目&#xff1a;物体受平面内三个互不平行的力作用而平衡&#xff0c;三个力的作用线&#xff08;&#xff09;。 题目&#xff1a;力偶对物体的作用效应&#xff0c;决定于&#xff08;&#xff09;。 题目&#xff1a;平面平行力系的独立平衡方程数目一般有&#xff…

node mysql安装目录_nodejs 指定全局安装路径和缓存路径

1、前提&#xff1a;已安装 nodejs(nodejs官网 https://nodejs.org), 并且已将其添加到了环境变量 path 中&#xff1b;2、进入cmd命令行&#xff0c;然后输入 node -v &#xff0c;测试是否安装成功&#xff0c;出现版本号就表示安装成功3、进入cmd命令行&#xff0c;然后输入…

【渝粤教育】广东开放大学 房屋建筑学 形成性考核 (50)

选择题 题目&#xff1a;以下基础一般应用于单层厂房的基础是 题目&#xff1a;以下属于刚性防水的是 题目&#xff1a;装配整体式钢筋混凝土楼板包括 题目&#xff1a;当主梁的跨度为7m时&#xff0c;以下主梁高设计尺寸合理为 题目&#xff1a;是指为了防止建筑物构件由于气候…

【渝粤教育】广东开放大学 文化项目管理 形成性考核 (36)

选择题 题目&#xff1a; ( )是依据一定的标准和程序&#xff0c;对政策的效益、效率及价值进行判断的一种政治行为&#xff0c;目的在于取得有关这些方面的信息&#xff0c;作为决定政策变化、政策改进和制定新政策的依据 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&…

mysql的sql执行原理图_性能测试MySQL之SQL运行原理

一&#xff0c;MySQL运行原理两个一样的图1&#xff0c;SQL语句执行的过程详细说明如上图所示&#xff0c;当向MySQL发送一个请求的时候&#xff0c;MySQL到底做了什么&#xff1a;a, 客户端发送一条查询给服务器。b, 服务器先检查查询缓存&#xff0c;如果命中了缓存&#xff…

穹顶灯打不出阴暗面_Java 8星期五:Java 8的阴暗面

穹顶灯打不出阴暗面在Data Geekery &#xff0c;我们喜欢Java。 而且&#xff0c;由于我们真的很喜欢jOOQ的流畅的API和查询DSL &#xff0c;我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 Java 8星期五 每个星期五&#xff0c;我们都会向您展示一些不错的教程风格的…

【渝粤教育】广东开放大学 物业服务营销管理 形成性考核 (59)

选择题 题目&#xff1a; 单选 &#xff08; &#xff09;是物业服务产品的期望产品。 答案&#xff1a;看左侧 题目&#xff1a; 单选 &#xff08; &#xff09;是指模仿市场上旺销的其他物业服务企业的产品而开发的某种新产品。 答案&#xff1a;看左侧 题目&#xff1a…

【渝粤教育】广东开放大学 系统工程 形成性考核 (25)

选择题 题目&#xff1a;系统工程与系统科学的区别是&#xff0c;前者是工程技术&#xff0c;后者是基础理论。 答案&#xff1a;看左侧 题目&#xff1a;"有机论”生物学认为&#xff0c;有机体可分解为各个部分&#xff0c;各个部分的功能完全决定了系统的功能和特性。 …

Java 11:JOIN表,获取Java流

是否曾经想过如何将联接的数据库表转换为Java Stream&#xff1f; 阅读这篇简短的文章&#xff0c;并了解如何使用Speedment Stream ORM完成它。 我们将从Java 8示例开始&#xff0c;然后研究Java 11的改进。 Java 8和JOIN 速度允许将动态JOIN&#xff1a;ed数据库表作为标准J…

mysql宽字节注入_转宽字节注入详解

在mysql中&#xff0c;用于转义的函数有addslashes&#xff0c;mysql_real_escape_string&#xff0c;mysql_escape_string等&#xff0c;还有一种情况是magic_quote_gpc&#xff0c;不过高版本的PHP将去除这个特性。首先&#xff0c;宽字节注入与HTML页面编码是无关的&#xf…

【渝粤教育】电大中专中药制剂学 (2)作业 题库

1.根据药典、药品标准等将药物加工制成具有一定规格&#xff0c;可直接用于临床的药物制品&#xff0c;称为&#xff08;&#xff09;。 A.制剂 B.剂型 C.单味中药 D.中成药 E.炮制 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;D 2.药材经过炮制后可直接用于中医临…

mysql集群软件有哪些_浅谈数据库集群软件优缺点有哪些

满心狼藉回答时间&#xff1a;2019-12-05向TA提问集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合&#xff0c;为用户提供网络服务或应用程序(包括数据库、Web服务和文件服务等)的单一客户视图&#xff0c;同时提供接近容错机的故障恢复能力。集群…

【渝粤教育】电大中专办公设备使用与维护 (2)作业 题库

1以下哪个不是现代办公硬件需求的主要依赖&#xff08;&#xff09;。 A扫描仪 B计算机 C办公桌 D打印机 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2现代办公设备可分为计算机、通信&#xff08;&#xff09;三大类。 A电子工具 B办公机械 C路由器 D碎纸机 错…

input发送a.jax_JAX-RS 2.0中的透明PATCH支持

input发送a.jaxPATCH方法是最不受欢迎的HTTP方法之一&#xff0c;因为直到最近才真正没有一种标准的PATCH格式。 一段时间以来&#xff0c;它已经针对JSON进行了标准化&#xff0c;因此有很多库可以为您完成繁重的工作。 出于本博客的目的&#xff0c;我将使用json-patch&#…

python 日志函数参数_将日志信息作为参数传递给函数

我使用的Python库使用logging模块。但是&#xff0c;我创建了自己的log函数&#xff0c;脚本在内部使用。在下面是我要使用的日志记录功能&#xff1a;def log(name, content, swtch : bool None, time None):time time or datetime.now(pytz.timezone(US/Pacific))if swtch…