복붙노트

[SPRING] 스프링 Aspectj @ Before all rest method

SPRING

스프링 Aspectj @ Before all rest method

Spring이 @GetMapping을 소개하기 전에 @RequestMapping에 관심을 갖는 주석이 하나만 있으므로이 aspect가 작동합니다

@Before("within(aa.bb.*.rest..*) && execution(public * *(..)) && @within(org.springframework.web.bind.annotation.RestController) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")

그러나 @GetMapping, @PostMapping을 사용할 수있게되면이 지점은 작동하지 않지만이 주석은 @RequestMapping이라는 메타 주석을 갖습니다.

@RequestMapping / @ {Get, Post, Put, Patch, ..} 매핑을 쉽게 가로 챌 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.나는이 문법이 나를 위해 여기에서 작동한다는 것을 알았다!

    나는이 문법이 나를 위해 여기에서 작동한다는 것을 알았다!

    @Pointcut("execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))")
    public void requestMappingAnnotations() { }
    

    또한 나는 그들 모두를 열거 할 수있다.

    @Pointcut("within(aa.bb.*.rest..*)  && @within(org.springframework.web.bind.annotation.RestController)")
    public void restControllers() {}
    
    @Pointcut("@annotation(org.springframework.web.bind.annotation.RequestMapping) " +
        "|| @annotation(org.springframework.web.bind.annotation.GetMapping)" +
        "|| @annotation(org.springframework.web.bind.annotation.PostMapping)" +
        "|| @annotation(org.springframework.web.bind.annotation.PathVariable)" +
        "|| @annotation(org.springframework.web.bind.annotation.PutMapping)" +
        "|| @annotation(org.springframework.web.bind.annotation.DeleteMapping)"
    )
    public void mappingAnnotations() {}
    
    @Pointcut("execution(@(@org.springframework.web.bind.annotation.RequestMapping *) * *(..))")
    public void requestMappingAnnotations() { }
    
    @Before("restControllers() && requestMappingAnnotations()")
    public void onExecute(JoinPoint jp) {}
    
  2. from https://stackoverflow.com/questions/42642681/spring-aspectj-before-all-rest-method by cc-by-sa and MIT license