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上找到示例項目的完整源代碼。
翻譯自: https://www.javacodegeeks.com/2014/02/java-exception-translation-with-aspectj.html
java aspectj
總結
以上是生活随笔為你收集整理的java aspectj_Java:AspectJ的异常翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组装一台电脑的流程自己组装电脑流程
- 下一篇: 穹顶灯打不出阴暗面_Java 8星期五: