2017-08-17 1 views
0

Meine einfache Anwendung funktioniert gut vor dem Hinzufügen der LoggingAspectConfiguration-Klasse. Der Quellcode ist wie folgt: (entfernt Import-Anweisungen)@Autowired Abhängigkeitsinjektion in @Aspect ist null für LoggerContext

Dies ist die Spitzenklasse

package com.rsa.tools.springmvc.configuration; 

public class ApplicationInitialization extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    protected Class<?>[] getRootConfigClasses() { 
    return new Class[] { ApplicationRootClassConfiguration.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
    return new Class[] { ApplicationWebConfiguration.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
    return new String[] { "/" }; 
    } 
} 

Diese Anwendung Wurzelklasse wo componentscan

package com.rsa.tools.springmvc.configuration.backend; 

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages={"com.rsa.tools.springmvc.configuration.general", "com.rsa.tools.springmvc.configuration.backend", "com.rsa.tools.springmvc.dao", "com.rsa.tools.springmvc.service"}) 
public class ApplicationRootClassConfiguration { 
} 

Logback Konfiguration

präsentiert
package com.rsa.tools.springmvc.configuration.general; 

@Configuration 
public class ApplicationLogbackConfiguration { 
    @Bean 
    public LoggerContext getLoggerContext() { ... } 
} 

Bis hier funktioniert es gut.

Nachdem ich addierten die folgenden Klasse:

package com.rsa.tools.springmvc.configuration.general; 

@Aspect 
@Component 
public class LoggingAspectConfiguration { 
    @Autowired 
    LoggerContext loggerCtx; 

    @Pointcut("execution(* *.*(..))") 
    protected void loggingOperation() {} 

    @Before("loggingOperation()") 
    @Order(1) 
    public void logJoinPoint(JoinPoint joinPoint) { 
    Logger logger = loggerCtx.getLogger(this.getClass()); 
    logger.trace("Join point kind : " + joinPoint.getKind()); 
    logger.info("Signature declaring type : "+ joinPoint.getSignature().getDeclaringTypeName()); 
    logger.info("Signature name : " + joinPoint.getSignature().getName()); 
    logger.info("Arguments : " + Arrays.toString(joinPoint.getArgs())); 
    logger.info("Target class : "+ joinPoint.getTarget().getClass().getName()); 
    logger.info("This class : " + joinPoint.getThis().getClass().getName()); 
    } 
    ... 
} 

ich da für loggerCtx Dependency Injection sehen Null-Zeiger-Ausnahme begonnen hat nicht funktioniert. Wie kann dieses Problem behoben werden?

+0

Ist '@ Order' die Anmerkung vom Frühling? Warum haben Sie es auf der 'logJoinPoint' Methode? –

+0

Ich habe es entfernt, immer noch das gleiche Problem. –

Antwort

0

Der Aspekt wird außerhalb des Federcontainers erstellt.

Statt LoggingAspectConfiguration schaffen als eine Komponente versuchen, es als bean in ApplicationLogbackConfiguration Erstellen (die eine Konfigurationsklasse ist)

eine setter Methode innerhalb LoggingAspectConfiguration schaffen LoggerContext

@Bean 
public LoggingAspectConfiguration getLoggerContext(LoggerContext context) 
{ 
LoggingAspectConfiguration aspect = new LoggingAspectConfiguration(); 
aspect.setLoggerContext (context) 
return aspect; 
} 

Federbehälter autowiresLoggerContext nach Typ (oder Sie können @Autowired Annotation in diesem Methodenparameter haben.

+0

Was ist "ein" hier? Wie kann ich Aspect angeben, wenn ich es als @Bean in der ApplicationLogbackConfiguration erzeuge? Sie haben Setter-Methode gesagt. Codebeispiel ist für Getter-Methode. Mir fehlt hier etwas. –

+0

Tippfehler korrigiert. Wie gesagt, der Aspekt ist außerhalb des Containers und t loggercontext ist eine Spring Bean und dies lässt den Container wissen, dass die Bean ein Aspekt ist, wenn sie geladen wird und dabei auch Loggercontext setzt. – surya

Verwandte Themen