2013-11-05 55 views
0

嗨,大家好我在桌面上使用log4j Spring應用程序。每當我故意爲我的數據庫連接使用無效的用戶名/密碼時,我都無法在日誌文件上記錄異常。我無法登錄異常:java.sql.SQLException:ORA-01017:無效的用戶名/密碼;登錄否認無法在Log4j Spring桌面應用程序中記錄java.sql.SQLException

下面是堆棧跟蹤,我的log4j.properties

log4j屬性

# Root logger option 
log4j.rootLogger=INFO, file, stdout, ERROR 

# Application logging options 
log4j.logger.org.apache=ERROR 
log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG  
log4j.logger.jdbc.resultset=ERROR 
log4j.logger.jdbc.connection=ALL 
log4j.logger.jdbc.resultsettable=OFF 

log4j.logger.org.springframework.jdbc.datasource.DataSourceTransactionManager=ERROR 
log4j.logger.org.springframework.transaction=ERROR 
log4j.logger.java.sql.SQLException=ALL 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=C:\\myapp.log 
log4j.appender.file.MaxFileSize=1MB 
log4j.appender.file.MaxBackupIndex=1 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 


# Direct log messages to stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

堆棧跟蹤

異常線程 「main」 組織。 springframework.transaction.CannotCreateTransactionExce注意: 無法打開JDBC連接進行事務處理;嵌套的異常是 java.sql.SQLException:ORA-01017:無效的用戶名/密碼;登錄 否認

at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:240) 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
at com.pldt.financials.service.AccountReceivableService$$EnhancerByCGLIB$$3a1d2243.generateUploadFile(<generated>) 
at com.pldt.core.App.start(App.java:33) 
at com.pldt.core.App.main(App.java:19) 

產生的原因:值java.sql.SQLException:ORA-01017:無效的用戶名/密碼;登錄被拒絕

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278) 
at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:792) 
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:364) 
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:454) 
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165) 
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35) 
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:802) 
at java.sql.DriverManager.getConnection(DriverManager.java:525) 
at java.sql.DriverManager.getConnection(DriverManager.java:140) 
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173) 
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164) 
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149) 
at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119) 
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:202) 

回答

0

Spring不記錄SQL異常。相反,它只是將它們包裝在相應的DataAccessException中並進一步拋出。捕獲和處理(例如日誌)運行時異常是您的應用程序的責任。爲了避免捕獲所有的代碼,你應該儘可能在調用堆棧中做到這一點。

2

問題似乎在於AOP事務對象中發生異常。由於AOP通過創建代理對象來工作,因此將引發異常,而不是您試圖捕獲異常的位置。我相信雖然有捕獲異常的AOP註釋,但我現在只能想到@Around註釋。

我剛剛學會了基本的AOP自己,但這裏是包括一個捕獲拋出的異常可用註釋的一個很好的總結:

@Aspect 
public class AfterThrowingExample { 

    @AfterThrowing("com.xyz.myapp.SystemArchitecture.dataAccessOperation()") 
    public void doRecoveryActions() { 
    // ... 
    } 

} 

來源: http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/aop.html