2013-11-05 3 views
0

안녕하세요, 저는 데스크톱 Spring 애플리케이션에서 log4j를 사용하고 있습니다. 의도적으로 내 데이터베이스 연결에 유효하지 않은 사용자 이름/암호를 사용할 때마다 로그 파일에 예외를 기록하는 데 문제가 있습니다. 나는 예외를 기록 할 수 없다 : 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 

스택 트레이스입니다 거부 스레드 "주요" 조직에서

예외입니다. springframework.transaction.CannotCreateTransactionExce ption : 트랜잭션에 대해 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

스프링은 SQL 예외를 기록하지 않습니다. 대신 해당 DataAccessException에 랩핑하고 추가로 throw합니다. 런타임 예외를 포착하고 처리하는 것은 응용 프로그램의 책임입니다 (예 : 로그). 코드 전체에 걸리는 것을 피하려면 가능한 한 호출 스택에서 상위 수준으로 수행해야합니다.

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