2016-04-06 6 views
0

Ich erstellte Test Spring MVC-Anwendung mit REST-Controller. Ich möchte Aspekte für meine Methode anwenden, aber wenn diese Methode aufgerufen wird, passiert nichts und ich kann den Grund nicht finden. Es ist meine Konfiguration und Anwendungsklasse:Spring Boot @Aspect J Protokollierung

@SpringBootApplication(scanBasePackages = "org.test") 
@EnableAspectJAutoProxy 
public class TestaopApplication { 

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

Es ist meine Aspekt Klasse:

@Aspect 
@Component 
public class Logging { 

private static final Logger logger = LoggerFactory.getLogger(GreetingController.class); 
@Pointcut("execution(* org.test.restspring.model.Greeting.getCreatedDate(..))") 
private void getDate(){} 

@Before("getDate()") 
public void beforeGettingDate(){ 
    logger.info("Date is asked"); 
} 

@After("getDate()") 
public void afterGettingDate(){ 
    logger.info("Date is received"); 
} 

}

Es ist meine einfache Bohne:

@Component 
public class Greeting { 

private long id; 
private String content; 
private Date created; 

public Greeting() { } 
public Greeting(long id, String content) { 
    this.id = id; 
    this.content = content; 
    this.created = Calendar.getInstance().getTime(); 
} 

public long getId() { 
    return id; 
} 

public String getContent() { 
    return content; 
} 

public String getCreatedDate(){ 
    return created.toString(); 
} 
} 

Es ist mein Controller:

@RestController 
public class GreetingController { 

private static final String template = "Hello, %s!"; 
private static final Logger logger = LoggerFactory.getLogger(GreetingController.class); 
private final AtomicLong counter = new AtomicLong(); 

@RequestMapping("/greeting") 
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { 
    Greeting response = new Greeting(counter.incrementAndGet(), 
      String.format(template, name)); 
    logger.info(response.getCreatedDate()); 
    return response; 
} 


} 

Bitte helfen Sie mir bei diesem Problem.

Antwort

0

Bohnen, die über expliziten Konstruktoraufruf (new Greeting(...)) erstellt wurden, werden nicht von Spring verwaltet. Deshalb wird dein Aspekt nicht angewendet.

Sie können versuchen, den Prototypbereich zu verwenden. Auf diese Weise erstellt Spring eine neue Bean-Bean-Bean für jede Anfrage.

für bean:

@Component 
@Scope("prototype") 
public class Greeting { 

und dem Controller:

@RestController 
public class GreetingController { 

private static final String template = "Hello, %s!"; 
private static final Logger logger = LoggerFactory.getLogger(GreetingController.class); 
private final AtomicLong counter = new AtomicLong(); 

@Autowired 
private Greeting greeting; 

@RequestMapping("/greeting") 
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { 
    greeting.setId(counter.incrementAndGet()); 
    greeting.setContent(String.format(template, name)) 
    logger.info(response.getCreatedDate()); 
    return response; 
} 



} 
+0

I einen Fehler GOR, aber wenn ich Verfahren ersetzen inexistent in @Pointcut (dieser Aspekt ist nicht auf Verfahren angewendet wird) Ich habe keinen Fehler. Es ist ein Fehler :: Fehler beim Schreiben der HTTP-Nachricht: org.springframework.http.converter.HttpMessageNotWritableException: Inhalt konnte nicht geschrieben werden: Für die Klasse org.springframework.aop.TrueClassFilter wurde kein Serializer gefunden und es wurden keine Eigenschaften zum Erstellen von BeanSerializer entdeckt (um eine Ausnahme zu vermeiden, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)) – Yuriy

+0

Und ich habe Getter und Setter in mir Gruß Klasse. – Yuriy