【问题标题】:Aspect not getting executed方面没有被执行
【发布时间】:2017-02-26 22:21:39
【问题描述】:

我的 AspectConfig

@Configuration
@EnableAspectJAutoProxy
public class LoggingAspectConfig {

    @Bean
    public SampleRestService restService() {
        return new SampleRestService();
    }

    @Bean
    public ServiceMonitor serviceMonitor() {
        return new ServiceMonitor();
    }
}

我的观点

@Aspect
@Component
public class ServiceMonitor {

    @Pointcut("@annotation(com.web.rest.logging.Monitor)")
    public void requestMapping() {}

    @Before("requestMapping()")
    public void logServiceStart(JoinPoint joinPoint) {
        System.out.println("Start: " + joinPoint);
        System.out.println(joinPoint.getSignature());
        System.out.println(joinPoint.getSignature().getName());
    }

}

我的样品服务

@Service
public class SampleRestService {

    @Monitor
    public static void getParams(){
        String url = "<sample url>";

         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);


         HttpEntity entity = new HttpEntity(headers);

         RestTemplate restTemplate =  new RestTemplate();

         ResponseEntity<String> response2 = restTemplate.exchange( url, HttpMethod.GET, entity , String.class );

         System.err.println(response2.getBody());

    }

我的注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Monitor {

}

我从带有 @Component 注释的控制器中使用此 getParams 调用

如果我遗漏了什么,请告诉我,

我需要添加更多配置吗?还是切入点表达式错误。

我有以下罐子

aspectjweaver-1.8.9.jar aspectjrt-1.8.9.jar spring-aop-4.2.0.RELEASE.jar

【问题讨论】:

    标签: java spring spring-aop


    【解决方案1】:

    您使用的是 Spring AOP 而不是 AspectJ,如配置注释 @EnableAspectJAutoProxy 所示。 Spring AOP 不等同于 AspectJ 编织。 Spring AOP 通过代理你的 spring 托管 bean 来工作,因此它只适用于 spring bean,具有基于代理的 AOP 与字节码编织的所有限制。您的候选方法getParams 是一个静态方法,因此它不是 Spring AOP 的候选方法。如果您打算坚持使用 Spring AOP,请使用普通的 AspectJ(编译时编织或加载时编织)或从方法中删除 static 关键字。如需进一步参考,请参阅this answer

    【讨论】:

    • 谢谢!,当我尝试注释针对 RequestMapping Annotation 的控制器方法时,即使它不起作用。我也错过了什么吗?
    • 这样,@Controller public class AjaxController 实现 SecuredController { @RequestMapping(value = { "/record/data" })
    猜你喜欢
    • 2017-11-27
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多