2014-04-07 64 views
2

使用AspectJ我已經注射服務爲一體的非管理域對象: 這是服務:自動裝配Autowired春豆定製SLF4J的appender

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

這是域對象:

@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); 
    } 
} 

以下測試成功:

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

如果我加

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

任何控制器我有預計在控制檯字符串: 「從記錄器服務的消息:測試消息」

然後我嘗試使用這項服務到自定義SLF4J附加器:

@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())); 
    } 
} 

但得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在這種情況下行爲不同嗎? PS:我的log4j.properties文件:

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環境中使用Spring管理的東西。而且做起來不容易,因爲log4j的東西在Spring之前就已經初始化了。 請參閱here關於類似主題的另一個討論。

相關問題