2016-07-19 1 views
1

hello() 메소드가 이 아니고이 아니라는 사실을 알기 원하면 @RequestMapping 메소드 호출에서 AOP를 수행하려고합니다.스프링 부트의 개인/보호 된 RequestMapping에서 AOP를 수행하는 방법

@RestController 
class HelloController { 
    @RequestMapping(value = "/hello", method = RequestMethod.GET) 
    String hello() { 
     return "Hello"; 
    } 
} 

여기에 내가 @Aspect, @EnableAspectJAutoProxy 주석을 추가 한 기본 클래스입니다. 난 그냥 의존성 아래에 추가의 pom.xml에

@Aspect 
@EnableAspectJAutoProxy(proxyTargetClass = true) 
@SpringBootApplication 
public class FooServiceApplication { 

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

    @Around("@annotation(requestMapping)") 
    public Object around(ProceedingJoinPoint pjp, RequestMapping requestMapping) throws Throwable { 
     return pjp.proceed(); 
    } 
} 

는 :

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
    </dependency> 

결과는 예와 같은 경우 같은 방법이 공개) (안녕하세요 경우 AOP 것 잘 작동하지만, 공공 선언없이 위에, AOP는 전혀 작동하지 않습니다. 하지만 아니요 EnableAspectJAutoProxy은 CGLIB를 사용하며 보호 된/개인 메서드 호출을 가로채는 수 있습니까? 때문에 Spring의 AOP 프레임 워크의 프록시 기반 자연

+0

없음이 할 수없는 선언에 추가합니다. –

+0

@ M.Deinum [스프링 부트 문서 (Aop on)] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators)를 확인했습니다. , 스프링 구동 [native AspectJ weaving] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw)을 사용하여 이 문제를 해결할 수는 있지만 권장하지는 않습니까? –

답변

2

documentation Spring의 프록시 기반의 AOP에 따르면 수 만 차단 public 방법

은, 보호 방법 (곳 JDK 프록시에 대해도, 차단하지 정의입니다 적용 할 수 없음) 또는 CGLIB 프록시 (기술적으로 가능하지만 AOP 목적으로 권장 할 수없는 경우). 결과적으로 주어진 pointcut은 공개 메소드와 만 일치합니다!

인터셉터에 보호 된/개인 메소드 또는 생성자가 필요한 경우 Spring의 프록시 기반 AOP 프레임 워크 대신 Spring 기반 원시 AspectJ 직조를 사용하는 것을 고려하십시오. 이것은 특성이 다른 AOP 사용의 다른 모드를 구성하므로 결정하기 전에 먼저 직조에 익숙해 져야합니다.

AspectJ 직조를 사용하기로 결정하기 전에 설명서에 appropriate section을 보내 결정을 내리는 것이 좋습니다.

대체

은 당신이 달성하고자하는 내용에 따라, 당신은 또한 Filters 사용을 고려할 수 있습니다.

필터는 모든 요청을 차단하고 헤더 추가, 제거, 인증, 로그 등의 기능을 제공합니다. 일반적으로 일반/응용 프로그램 전체 작업을 실행합니다.

는 프록시 기반의 AOP의 제한 사항입니다, 하나는 단순히 클래스

import org.springframework.web.filter.GenericFilterBean; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import java.io.IOException; 

public class SomeFilter extends GenericFilterBean { 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     /*execute your logic*/ 
     if (/* request may proceed*/) { 
      chain.doFilter(request,response); 
     } else { 
      /* write response */ 
     } 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 위에서 언급 한대로 Spring 설명서를 보았습니다. Spring에 익숙하지 않으므로, AOP를 사용하지 않고 커스터마이징을하기 위해 Spring Context 내의 RestController를 가로 챌 수있는 방법이 있습니까? 그렇지만 Spring의 자체 인터페이스 또는 콜백을 활용할 수 있습니까? –

+0

정말 ** 사용자 정의를 수행하는 ** ** 의미 :)에 달려 있습니다. 필터를 읽고 사용자 정의 요구 사항에 적합한 지 확인할 수도 있습니다. (업데이트 된 답변) – Matyas

관련 문제