Java:AspectJ的异常翻译
在這篇博客文章中,我描述了如何使用AspectJ自動將一種異常類型轉(zhuǎn)換為另一種異常類型。
問題
有時,我們處于必須將異常(通常由第三方庫引發(fā))轉(zhuǎn)換為另一種異常的情況。 假設(shè)您使用的是諸如hibernate之類的持久性框架,并且您不想將hibernate特定的異常泄漏到某個應(yīng)用程序?qū)又狻?也許您正在使用不止一種持久性技術(shù),并且想將技術(shù)特定的異常包裝到一個通用的基本異常中。 在這種情況下,可以以如下代碼結(jié)尾:
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,我們可以定義橫切關(guān)注點,為我們處理異常轉(zhuǎn)換過程。
首先,我們必須將AspectJ依賴項添加到我們的項目中:
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.7.4</version> </dependency>接下來,我們必須為AspectJ設(shè)置ajc,編譯器和字節(jié)碼編織器。 此步驟取決于您使用的開發(fā)環(huán)境,因此在此不再贅述。 Eclipse用戶應(yīng)該查看用于Eclipse的AspectJ開發(fā)工具(AJDT) 。 IntelliJ IDEA用戶應(yīng)確保啟用AspectJ插件 。 還有一個AspectJ Maven插件可用(請檢查此pom.xml以獲取示例配置)。
現(xiàn)在讓我們使用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批注定義一個建議,如果傳遞的切入點匹配則始終執(zhí)行該建議。 在這里,切入點
execution(*?com.mscharhag.exceptiontranslation.repository..*(..))每次執(zhí)行com.mscharhag.exceptiontranslation.repository包中的類的方法時,告訴AspectJ調(diào)用translateToDataAccessException()。
在translateToDataAccessException()中,我們可以使用傳遞的ProceedingJoinPoint對象來進行我們截獲的方法執(zhí)行。 在此示例中,我們僅在方法執(zhí)行周圍添加了一個try / catch塊。 使用ProceedingJoinPoint實例,我們還可以做更多有趣的事情,例如使用pjp.getSignature()分析方法簽名或使用pjp.getArgs()訪問方法參數(shù)。
現(xiàn)在,我們可以從上面顯示的示例存儲庫實現(xiàn)中刪除try / catch塊,并使用簡單的測試來驗證我們的方面是否正常工作:
public?class?MyRepositoryTest?{private?MyRepository?repository?=?new?MyRepository();@Test(expected?=?DataAccessException.class)public?void?testExceptionTranslation()?{this.repository.getSomeData();} }結(jié)論
使用AspectJ,我們可以輕松地自動執(zhí)行Java運行時異常的轉(zhuǎn)換。 通過刪除try / catch塊,否則將簡化異常轉(zhuǎn)換,從而簡化了我們的代碼。
- 您可以在GitHub上找到示例項目的完整源代碼。
翻譯自: https://www.javacodegeeks.com/2014/02/java-exception-translation-with-aspectj.html
總結(jié)
以上是生活随笔為你收集整理的Java:AspectJ的异常翻译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAX-RS 2.0中的透明PATCH支
- 下一篇: Java EE 8:社区想要什么?