2009-05-07 6 views
0

Ich habe eine java.util.logging.Logger Bean initialisiert und möchte nun eine Handler hinzufügen, für die ich auch eine Bean erstellt habe. Das Problem ist die Logger Methode heißt addHandler anstelle von etwas wie setHandler.Kann Spring "non-bean" Felder initialisieren?

Wie kann ich den Handler in den Logger injizieren?

Muss ich den Logger in eine Spring-freundliche Bean-Klasse einpacken?

EDIT

Wenn mir jemand auch sagen kann, wie in der Logging-Ebene passieren (was ein statischer Wert ist) Ich wäre Ihnen sehr verbunden.

Antwort

4

AKTUALISIERUNG: Geändert, um java.util.logging zu verwenden, und zeigen, wie Ebene festgelegt wird.

können Sie diese verwenden, indem eine FactoryBean Implementierung mit:

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

Dann definieren Sie Ihre Bohne in XML wie:

<!-- 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> 

Beispiel Unit-Test:

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