2009-05-07 19 views
0

私はjava.util.logging.Loggerのbeanを初期化しましたが、今度はbeanを作成したHandlerを追加します。問題はLoggerメソッドはsetHandlerの代わりにaddHandlerと呼ばれています。Springは「非Bean」フィールドを初期化できますか?

ハンドラーをロガーに挿入するにはどうすればよいですか?

SpringフレンドリーなBeanクラスでLoggerをラップする必要がありますか?

EDIT

誰かがまた、私はずっと義務があると思います(静的な値である)どのようにロギングレベルを渡すために私を伝えることができます。

答えて

4

UPDATE:java.util.loggingを使用するように変更され、レベルの設定方法が示されました。

あなたはFactoryBean実装を持っていることによって、これを使用することができます。

package foo.bar; 

import java.util.List; 
import java.util.logging.Handler; 
import java.util.logging.Logger; 

import org.springframework.beans.factory.FactoryBean; 

public class LoggerFactoryBean implements FactoryBean { 

    private final Logger logger; 

    public LoggerFactoryBean(java.util.logging.Logger logger, 
      List<Handler> handlers) { 
     this.logger = logger; 
     for (Handler handler : handlers) { 
      logger.addHandler(handler); 
     } 
    } 

    @Override 
    public Object getObject() throws Exception { 
     return logger; 
    } 

    @Override 
    public Class getObjectType() { 
     return Logger.class; 
    } 

    @Override 
    public boolean isSingleton() { 
     return true; 
    } 
} 

その後のようなXMLであなたのBeanを定義します:

<!-- returns logger with handlers --> 
    <bean id="logger" class="foo.bar.LoggerFactoryBean"> 
    <constructor-arg> 
     <!-- raw logger without handlers --> 
     <bean class="java.util.logging.Logger" factory-method="getAnonymousLogger"> 
     <property name="level"> 
      <value>SEVERE</value> 
     </property> 
     </bean> 
    </constructor-arg> 
    <constructor-arg> 
     <util:list> 
     <bean class="java.util.logging.FileHandler" /> 
     </util:list> 
    </constructor-arg> 
    </bean> 

例ユニットテスト:

package foo.bar; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotNull; 

import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 

@ContextConfiguration(locations = { "classpath:/foo/bar/test-config.xml" }) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class HandlerTest { 

    @Autowired 
    private Logger logger; 

    @Test 
    public void testLogger() { 
     assertNotNull(logger); 
     assertEquals(Level.SEVERE, logger.getLevel()); 
    } 
} 
関連する問題