аспекты не работают в моем весеннем проекте - PullRequest
1 голос
/ 03 мая 2020

О классе Aspect:

@Aspect
@Component
public class PostAop{

    @Around("execution(* com.blog.controllers.PostController.add(..)) && args(request,..)")
    public String Authorized(ProceedingJoinPoint jp, HttpServletRequest request) throws Throwable {

И для класса аннотаций:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) // can use in method only.
public @interface Authorized {

    public boolean Admin() default true;
    public boolean Writer() default false;

}

И, наконец, это мой класс конфигурации аспектов:

@Configuration
@ComponentScan(basePackages = { "com.blog" })
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AspectConfig {
    @Bean
    public PostAop postAop(){
        return new PostAop();
    }
}

И это это класс PostController:

@Controller
@RequestMapping(value = {"","/post"})
public class PostController {
         ...
    @GetMapping("/add")
    @Authorized(Writer = true)
    public String add(ModelMap model,Article article,HttpSession session) {

        model.addAttribute("tags", tagService.getAllTags());
        model.addAttribute("users", userService.getAllUsers());
        model.addAttribute("post", post);
        return "post/add";
    }

На самом деле я не знаю, в чем проблема, я не получаю никаких исключений при запуске приложения, но мой аспектный класс PostAop никогда не вызывается. Я что-то пропустил в конфигурации ??

1 Ответ

1 голос
/ 03 мая 2020

Выражение pointcut

@Around("execution(* com.blog.controllers.PostController.add(..)) && args(request,..)")

можно объяснить как совет для точки соединения (выполнение метода в случае Spring AOP), которая соответствует следующему условию

выполнение метода com.blog.controllers.PostController.add любого возвращаемого типа (*) и любых аргументов (..)

и

, этот метод должен иметь HttpServletRequest request в качестве первого аргумента

Теперь в вашем PostController метод add(ModelMap model,Article article,HttpSession session) не будет соответствовать выражению pointcut

Выражение pointcut сработает, если вы удалите args(request,..) и вы сможете получить доступ к HttpServletRequest следующим образом

@Around("execution(* com.blog.controllers.PostController.add(..)) && within(com.blog.controllers..*)")
public String authorized(ProceedingJoinPoint jp) throws Throwable {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
            .getRequest();
    return (String) jp.proceed();
}

within() is Обозначение области видимости, позволяющее сузить область действия классов до совета.

Примечание:

Когда вы аннотируете класс Aspect с помощью @Component, он будет автоматически определен @ComponentScan(basePackages = { "com.blog" }), если PostAop находится на любом уровне в пакете root com.blog. Это означает, что вам не нужно создавать компонент с использованием фабричного метода и аннотации @Bean. Требуется либо @Component, либо @Bean.

В соответствии с java соглашением об именах имя метода будет authroized(), а не Authorized()

Надеюсь, это поможет.

...