2017-08-17 5 views
0

Ma simple application fonctionne correctement avant d'ajouter la classe LoggingAspectConfiguration. Le code source est la suivante: (retiré des déclarations d'importation)L'injection de dépendance @Autowired dans @Aspect est null pour LoggerContext

C'est la classe supérieure

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[] { "/" }; 
    } 
} 

Ceci est l'application classe racine où componentscan présente

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

configuration Logback

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

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

Jusqu'à ici ça fonctionne bien.

Après avoir ajouté la classe suivante:

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

j'ai commencé à voir exception de pointeur NULL parce que pour l'injection de dépendance loggerCtx ne fonctionnait pas. Comment résoudre ce problème?

+0

Est-ce que '@ Order' est l'annotation du printemps? Pourquoi l'avez-vous dans la méthode 'logJoinPoint'? –

+0

Je l'ai enlevé, toujours le même problème. –

Répondre

0

L'aspect est créé à l'extérieur du récipient à ressort.

Au lieu de créer LoggingAspectConfiguration comme composant essayer de créer comme haricot dans ApplicationLogbackConfiguration (qui est une classe de configuration)

créer un mutateur à l'intérieur LoggingAspectConfiguration pour

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

conteneur Spring autowiresLoggerContext par type (ou vous pouvez avoir annotation @Autowired dans ce paramètre de méthode.).

+0

Qu'est-ce qu'un "a" ici? Comment spécifier Aspect si je le crée en tant que @Bean dans ApplicationLogbackConfiguration? Vous avez dit la méthode de setter. L'exemple de code est pour la méthode getter. Il me manque quelque chose ici. –

+0

Typo corrigé. Comme je l'ai dit, l'aspect est en dehors du conteneur et t loggercontext est un haricot de printemps, ce qui permet au conteneur de savoir que le bean est un aspect quand il le charge et ainsi de définir le loggercontext. – surya