2014-04-07 2 views
2

: 이 서비스 :를 autowire 스프링 콩 내가 관리되지 않는 도메인 객체로 서비스를 주입 한 AspectJ를 사용

@Configurable(dependencyCheck = true) 
public class DomainObject { 
    private IAppenderService appenderService; 
    @Autowired 
    public void setAppenderService(IAppenderService appenderService) { 
     this.appenderService = appenderService; 
    } 
    public IAppenderService getAppenderService() { 
     return appenderService; 
    } 

    public String formMessage(String message){  
     return appenderService.getLoggerMessage(message); 
    } 
} 

다음 테스트 :

@Service 
public class DomainServiceImpl implements DomainService { 
    public String getLoggerMessage(String prevMessage) { 
      return String.format("Message from logger service:%s", prevMessage); 
    } 
} 

이 도메인 객체입니다 성공했습니다 :

@Test 
    public void testAppender(){ 
     DomainObject domainObject = new DomainObject(); 
     assertNotNull(domainObject.getAppenderService()); 
    } 

는 "로거 서비스에서 메시지 : 테스트 메시지"

@Configurable(dependencyCheck = true) 
public class MyAppender extends AppenderSkeleton { 
    IAppenderService appenderService;   
    @Autowired 
    public void setAppenderService(IAppenderService appenderService) { 
     this.appenderService = appenderService; 
    } 
    public IAppenderService getAppenderService() { 
     return appenderService; 
    } 
    @Override 
    public void close() { 
    } 
    @Override 
    public boolean requiresLayout() {  
     return false; 
    } 
    @Override 
    protected void append(LoggingEvent event) {  
     System.out.println(new DomainObject().formMessage(event.getMessage().toString())); 
    } 
} 

그런

내가 정의 SLF4J의 펜더에이 서비스를 사용하려고 내가이 콘솔에 문자열을 예상있어 한 모든 컨트롤러에

System.out.println(new DomainObject().formMessage("test message")); 

하지만 NPE가 있어야합니다 :

java.lang.NullPointerException 
    at sbk.spring.testaopjc.domain.DomainObject.formMessage(DomainObject.java:19) 
    at sbk.spring.testaopjc.appender.MyAppender.append(MyAppender.java:29) 
    at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) 

동시에 테스트가 성공적으로 완료되었습니다.

public void testAppendeSecond(){ 
     MyAppender appender = new MyAppender(); 
     assertNotNull(appender.getAppenderService()); 
    } 

왜이 경우 MyAppender가 다른 방식으로 작동하는지 설명 할 수 있습니까? 추신 :

log4j.rootLogger=INFO, STDOUT 

log4j.appender.STDOUT=sbk.spring.testaopjc.appender.MyAppender 
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout 
log4j.appender.STDOUT.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%M:%L - %m%n 
+1

보인다. –

+0

조언을주세요. – Sobik

답변

0

이 아이디어는 아마 동일한 구성으로, 이전에 논의되었지만, 다소 비슷한 : 내 log4j.properties는 파일. 기본적으로, 그것은 log4j 기반 환경에서 Spring 관리 방식을 사용하는 것에 관한 것입니다. 그리고 log4j는 Spring 전에 초기화되기 때문에 쉽게 할 수 없습니다. here 비슷한 주제에 대한 다른 토론을 참조하십시오.

관련 문제