2016-02-13 52 views
0

我想捕獲在我的應用程序中發生的所有異常/錯誤。
因此,我搜索了stackoverflow,並在這個問題上遇到了問題:Java Exception Listener
現在我想知道這是否可以以更好的方式完成。Spring Java Exception Listener without web

我當前的應用程序:
我使用與Spring JPA Spring框架在獨立代碼沒有 Web組件。我有一個Config.java文件有四個主要的豆類:

  • 時間韋弗
  • 數據源
  • 實體管理器工廠
  • 事務管理

現在我認爲我可能會使用的東西如下所示:

package me.test; 

import java.beans.ExceptionListener; 
import org.springframework.stereotype.Component; 

@Component 
public class ErrorListener implements ExceptionListener { 
    @Override 
    public void exceptionThrown(Exception e) { 
     System.out.println("Some error occured ... That's bad :("); 
    } 
} 

我不確定這ExceptionListener是否像我想讓他工作一樣,所以我想也許有人可以向我解釋,如果我想要的可能或不可能。
也許不是用這個監聽器,而是用其他方法?

另外還有其他一般問題:
我該如何註冊一個聽衆?是不是也有一個@EventListener詮釋?我是否必須在一個方法之前放置它,然後讓它作爲Component的一部分通過彈簧進行掃描?
或者我必須在我的上下文中手動註冊嗎?

謝謝:)

---編輯---

AfterThrowing這個想法似乎很不錯(見下面的評論)。現在我的項目是這樣的:

在主

new AnnotationConfigApplicationContext(Config.class); 

Config.java

@EnableTransactionManagement 
@ComponentScan("me.test.*") 
@Configuration 
@EnableJpaRepositories 
@EnableAspectJAutoProxy 
public class Config { 
    @AfterThrowing(pointcut = "execution(public * *(..)", throwing = "ex") 
    public void doRecoveryActions(DataAccessException ex) { 
     System.out.println("Error found"); 
    } 
    /* loadTimeWeaver, dataSource, entityManagerFactory and transactionManager with the "@Bean" annotation */ 
} 

,然後在隨機文件的東西,拋出一個錯誤,如int i2 = 5/0;,並在其他級別throw new Exception("test");
但不幸的是它也沒有工作:(
我在做什麼錯?

回答

1

你可以使用Spring AOP的建議這個地方,你會拋出建議後使用。

+0

我已經想過這個問題,但' @ Around'需要一個函數作爲參數,那麼我怎麼才能完成一個函數,這個函數在拋出異常時執行,無論在哪裏? – christopher2007

+1

你可以做的是如下 @Aspect public class AfterThrowingExample { @AfterThrowing( pointcut="execution(public * *(..)", throwing="ex") public void doRecoveryActions(DataAccessException ex) { // ... } }

+0

基本上如果有公共方法拋出異常執行建議方法。您可以根據您的要求更改切入點 –