2015-05-19 26 views
12

Ho problemi a ottenere la mia funzione di registrazione per registrare le informazioni quando si accede ai metodi da classi di un particolare pacchetto. In altre parole, si verifica "no". Mi sono persino disperata e ho aggiunto le dichiarazioni di System.out.println, senza fortuna.Aspetti per il boot di avvio a molla

Tutte le mie classi sono situati sotto il pacchetto org.my.package, cioè org.my.package.controller, org.my.package.model, ecc

Ecco la mia classe di applicazione:

package org.my.package; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.EnableAspectJAutoProxy; 

@Configuration 
@ComponentScan(basePackages = {"org.my.package.config"}) 
@EnableAutoConfiguration 
@EnableAspectJAutoProxy 
public class FirstWebAppApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(FirstWebAppApplication.class, args); 
    } 
} 

Questa è la mia classe di configurazione:

package org.my.package.config; 

import org.deloitte.javatraining.daythree.utilities.MyLogger; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.EnableAspectJAutoProxy; 

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages = {"org.my.package.utilities"}) 
public class AssetConfig { 

    //----------------------------------------------------------------------------------------------------------------------- 
    @Bean 
    public MyLogger myLogger(){ 
     return new MyLogger(); 
    } 
} 

Questa è la mia classe Aspetto:

package org.my.package.utilities; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
import org.springframework.stereotype.Component; 

@Aspect 
@Component 
public class MyLogger { 

    /** Handle to the log file */ 
    private final Log log = LogFactory.getLog(getClass()); 

    public MyLogger() {} 

    @AfterReturning("execution(* org.my.package.*.*(..))") 
    public void logMethodAccessAfter(JoinPoint joinPoint) { 
     log.info("***** Completed: " + joinPoint.getSignature().getName() + " *****"); 
     System.out.println("***** Completed: " + joinPoint.getSignature().getName() + " *****"); 
    } 

    @Before("execution(* org.my.package.*.*(..))") 
    public void logMethodAccessBefore(JoinPoint joinPoint) { 
     log.info("***** Starting: " + joinPoint.getSignature().getName() + " *****"); 
     System.out.println("***** Starting: " + joinPoint.getSignature().getName() + " *****"); 
    } 
} 

Questi sono i miei Gradle costruire dipendenze:

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") 
    compile("org.springframework.boot:spring-boot-starter-web") 
    compile('com.h2database:h2:1.3.156') 
    compile('javax.servlet:jstl:1.2') 
    compile('org.springframework.boot:spring-boot-starter-aop') 
    providedRuntime("org.apache.tomcat.embed:tomcat-embed-jasper") 
    testCompile("org.springframework.boot:spring-boot-starter-test") 
} 

Mi manca qualcosa o altro mis-configurazione mia classe Aspect? Non riesco a trovare nulla di sbagliato, dopo aver verificato con altre domande simili Stack Overflow e tutorial online.

Si prega di avvisare.

+1

Attualmente si stanno verificando solo i metodi sulle classi nei pacchetti secondari 'org.my.package'. Quello che probabilmente si desidera è 'execution (* org.my.package .. *. * (..))' nota '..' invece di' .'. –

+0

* face-palm * Grazie !! Era così. Per favore rispondi con una risposta, così posso darti credito per questa domanda. – Rick

risposta

12

Il punto di interruzione, execution(* org.my.package.*.*(..)), corrisponde solo all'esecuzione dei metodi sulle classi nel pacchetto org.my.package non ai pacchetti secondari.

Quello che probabilmente si desidera è execution(* org.my.package..*.*(..)) avviso il .. anziché ..