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上找到示例项目的完整源代码。

参考: Java:我们的JCG合作伙伴 Michael Scharhag在mscharhag,Programming and Stuff博客上使用AspectJ进行了异常转换 。

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

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

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

相关文章

sparkstreaming监听hdfs目录_大数据系列之Spark Streaming接入Kafka数据

Spark Streaming官方提供Receiver-based和Direct Approach两种方法接入Kafka数据&#xff0c;本文简单介绍两种方式的pyspark实现。1、Spark Streaming接入Kafka方式介绍Spark Streaming 官方提供了两种方式读取Kafka数据&#xff1a;一是Receiver-based Approach。该种读取模式…

php职业认证,如何用 PHP 进行 HTTP 认证

PHP 的 HTTP 认证机制在 PHP 以 Apache 模块方式运行时才有效&#xff0c;因此该功能不适用于 CGI 版本。在 Apache 模块的 PHP 脚本中&#xff0c;可以用 header() 函数来向客户端浏览器发送“Authentication Required”信息&#xff0c;使其弹出一个用户名/密码输入窗口。当用…

时间服务器

时间服务器配置&#xff1a; 1 安装软件包: [rootlocalhost ~]# yum install ntp –y 2 修改配置文件 [rootlocalhost ~]# vim /etc/ntp.conf # 允许内网其他机器同步时间 192.168.1.0该网段 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 允许任何ip的客户机都可以…

使用 HTML5 Canvas 绘制出惊艳的水滴效果

HTML5 在不久前正式成为推荐标准&#xff0c;标志着全新的 Web 时代已经来临。在众多 HTML5 特性中&#xff0c;Canvas 元素用于在网页上绘制图形&#xff0c;该元素标签强大之处在于可以直接在 HTML 上进行图形操作&#xff0c;具有极大的应用价值。 这里分享一个惊艳的 Canva…

Java EE 8:社区想要什么?

在进行了之前的两次社区调查之后&#xff0c;第一次调查于2013年12月发布&#xff0c;第二次调查于2014年1月发布&#xff0c;Oracle呼吁企业社区对Java EE 8进行第三次也是最后一次调查 。该调查的截止日期为2014年3月24日&#xff0c;12日。太平洋时间。 值得注意的是&#…

mysql 字符串类型 char varchar

字符类型用在存储名字、邮箱地址、家庭住址等描述性数据 char指的是定长字符&#xff0c;varchar指的是变长字符 #官网&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/char.html #注意&#xff1a;char和varchar括号内的参数指的都是字符的长度#char类型&#xff1a;定长…

二叉树遍历规则

树的遍历顺序大体分为三种&#xff1a;前序遍历&#xff08;先根遍历、先序遍历&#xff09;&#xff0c;中序遍历&#xff08;中根遍历&#xff09;&#xff0c;后序遍历&#xff08;后根遍历&#xff09;。 如图所示二叉树&#xff1a; 前序遍历&#xff1a;前序遍历可以记为…

vue vue的table表格自适应_vue table autoHeight(vue 表格自动高度)

小编主要做的都是后台管理系统&#xff0c;采用布局多为头部、左侧菜单栏&#xff0c;右侧内容&#xff0c;头部和菜单栏固定位置&#xff0c;内容部分如果很长就会出现滚动条(iview和element都提供了布局容器)&#xff0c;后台管理系统多为表格的增删改查&#xff0c;so&#…

php网页的注册界面设计,HTML开发博客之注册页面设计(一)

CSS文件的引入新建文件reg.html文件首先我们来分析网页布局这是我们页面完成后的效果&#xff0c;网页分为三部分头部&#xff0c;主体&#xff0c;和底部我们按照这个顺序开始编写。头部导航栏的编写html>用户注册页面首页科技资讯心情随笔资源收藏图文图片留言板登陆/注册…

Arctext.js - 基于 CSS3 jQuery 的文本弯曲效果

Arctext.js 是基于 Lettering.js 的文本旋转插件&#xff0c;根据设置的旋转半径准确计算每个字母的旋转弧度并均匀分布。虽然 CSS3 也能够实现字符旋转效果&#xff0c;但是要让安排每个字母都沿着弯曲路径排布相当的复杂&#xff0c;结合 Arctext.js 则可以轻松实现这个效果。…

在JDT中使用Java 8 Lambda

旧 Curmudgeon 认识Smalltalk的Dude 在修改Eclipse Java开发工具 &#xff08;JDT&#xff09;项目正在开发的Java 8支持时&#xff0c;我一直在使用这种语言。 我承认我对Java 8中的lambda有点不满意。 当然&#xff0c;这来自于知道Smalltalk &#xff08;和LISP / Schem…

[POJ1463] Strategic game

题目链接&#xff1a; 传送门 题目大意&#xff1a; Bob非常享受玩电脑游戏的过程&#xff0c;尤其是策略游戏&#xff0c;但是在有些时候&#xff0c;他因为不能在第一时间找到最佳的策略而十分伤心。 现在&#xff0c;他遇到了一个问题。他必须保卫一个中世纪的城市&#xff…

zabbix邮件告警

zabbix邮件告警调用第三方邮件服务来发送邮件。 [roottiandong ~]# yum install mailx -y 修改配置文件 [roottiandong ~]# vim /etc/mail.rc 67 set from15600857257163.com smtpsmtp.163.com 68 set smtp-auth-user15600857257163.com 69 set smtp-auth-password密码&#xf…

模糊推理机制 matlab,基于模糊综合评判推理机制的学生素质评价系统设计与实现...

第22卷第2期2002年2月文章编号&#xff1a;(2002)l00l-908l2-008l-03计算机应用ComputerAppIicationsVoI.22,No.2Feb.,2002基于模糊综合评判推理机制的学生素质评价系统设计与实现尹世群(西南师范大学计算机与信息科学学院&#xff0c;重庆4007l5)摘要&#xff1a;根据模糊数学…

SweetAlert – 替代 Alert 的漂亮的提示效果

Sweet Alert 是一个替代传统的 JavaScript Alert 的漂亮提示效果。SweetAlert 自动居中对齐在页面中央&#xff0c;不管您使用的是台式电脑&#xff0c;手机或平板电脑看起来效果都很棒。另外提供了丰富的自定义配置选择&#xff0c;可以灵活控制。 在线演示 插件下载 您可…

onpagefinished等了很久才执行_今天自律了吗?停课不停锻炼 才是战疫正确姿势

近日&#xff0c;中青校媒面向全国915名高校学生发起关于“宅家运动”情况的调查&#xff0c;发现15.39%被调查者在家期间会严格执行锻炼计划&#xff0c;39.96%选择间歇性完成制订的运动目标&#xff0c;还有44.65%在家很少运动。(3月18日《中国青年报》)新冠肺炎疫情发生&…

Spring Data Couchbase 1.0 GA发布

Spring Data Couchbase 1.0 GA版本已发布&#xff01; 该项目是Spring Data项目的一部分&#xff0c;该项目旨在为新数据存储提供熟悉且一致的基于Spring的编程模型&#xff0c;同时保留特定于存储的功能。 Spring Data Couchbase项目提供了与Couchbase Server数据库的集成。 …

网络验证php接口逆向,一个专利查错的逆向(网络验证)

[C#] 纯文本查看 复制代码bool flag true;if (!fileInfo.CreationTime.ToString().Equals(configData.fileCreateTime))//这里是校验License&#xff0c;直接删除掉{MessageBox.Show("认证文件已损坏&#xff01;");flag false;Application.Exit();}if (flag){Lice…

kickstart-G

感觉自己很蠢&#xff0c;large数据只能交一次&#xff0c;忘记这回事了 A题 O(n^2)解法&#xff0c;用vector<set> 缓存j后面的数据&#xff0c;减少一重循环 1 #include <string>2 #include <vector>3 #include<iostream>4 #include<cstdio>5 …

Ocrad.js – JS 实现 OCR 光学字符识别

Ocrad.js 相当于是 Ocrad 项目的纯 JavaScript 版本&#xff0c;使用 Emscripten 自动转换。这是一个简单的 OCR &#xff08;光学字符识别&#xff09;程序&#xff0c;可以扫描图像中的文字回文本。 不像 GOCR.js&#xff0c;Ocrad.js 被设计成一个端口&#xff0c;而不是围绕…