2014-05-12 3 views
6

Spring (3.2.3) @Controller의 모든 메소드 앞에 일부 코드를 실행하고 싶습니다. 다음 정의 된 있지만 실행되지 않습니다. pointcut 표현이 올바르지 않은 것 같습니다.컨트롤러의 모든 메소드에 대한 Spring AOP 포인트 컷

디스패처-servlet.xml에

<aop:aspectj-autoproxy/> 
<bean class="com.example.web.controllers.ThingAspect"/> 

c.e.w.c.ThingAspect

@Pointcut("execution(com.example.web.controllers.ThingController.*(..))") 
public void thing() { 
} 

@Before("thing()") 
public void doStuffBeforeThing(JoinPoint joinPoint) { 
    // do stuff here 
} 
+1

어쩌면 ['@ ControllerAdvice'] (http://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice .html) 당신이 찾고있는 것입니다. –

+0

(a) 전혀 실행되지 않거나 (b) 일부 메소드에서 실행되지 않습니까? 이렇게하면 문제를 진단하는 데 도움이됩니다. – Phil

+0

ControllerAdvice는 존재하지 않았지만 ExceptHandler, InitBinder 및 ModelAttribute를 여러 컨트롤러에 연결하기위한 설명서를 보았습니다. 필자는 모든 경우에 RequestMapping 주석이 달린 메소드가 있기 전에 실행할 메소드를 찾고있었습니다. 현재 Aspect는 어떤 방법으로도 호출되지 않습니다. 나는 Spring Interceptor를 사용할 수 있었지만 AOP는 작업에 이상적으로 보였다. – Goose

답변

4

pointcut 표현식에 void, String 또는 *과 같은 반환 유형이 없습니다.

execution(* com.example.web.controllers.ThingController.*(..)) 
7

스프링 MVC의 현재 버전에서 작업을 수행하는 올바른 방법은 ControllerAdvice하는 것입니다.
은 참조 : Advising controllers with the @ControllerAdvice annotation 이전 버전의

이, 내이 대답을 참조하십시오 https://stackoverflow.com/a/5866960/342852

+0

이것은 받아 들인 대답으로 표시되어야합니다 ... – kaqqao

+0

@kaqqao 동의하지 않는'@ ControllerAdvice'는 특정한 가능성을 가지고 있습니다. 아마도'@ ModelAttribute'를 사용하여 모든'@ RequestMapping' 메소드를 인터셉트 할 수 있지만'Model' 컨텍스트 만 가질뿐입니다. 제 생각에는 @geoand를 upvote해야한다고 생각합니다. 스프링 MVC 인터셉터를 보지는 않았지만,'ControllerAdvice'는 충분히 강력하지 않습니다. – froginvasion

+0

@geoand 답변은 참 좋았고 나는 지금 막 상향 조정했다. 그래도 질문은 실제로 구체적인 내용에 대해서는별로 말하지 않았습니다. 각 메서드가 실행되기 전에 무언가가 실행되어야하고'@ ControllerAdvice'가 수행합니다 ... – kaqqao

2

이미 다른 답변에서 언급 한 @ControllerAdvice 게다가, 당신은 Spring MVC interceptors을 확인해야합니다.

그들은 기본적으로 컨트롤러 용 AOP를 단순화하고 @ControllerAdvice이 충분한 전력을 제공하지 않는 경우에 사용할 수 있습니다.

관련 문제