2017-09-14 71 views
0

我使用spring引導和aspectj創建了一個庫。使用Spring引導和aspectj創建庫

我已經創建了一個配置類

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages="com.x.y") 
public class LoggerConfig { 
} 

一類用於註解

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

和一類用於方面

@Aspect 
@Component 
public class LoggerAspect { 

@Around("execution(* *(..)) && @annotation(EnableHttpLogging)") 
    public Object handleController(final ProceedingJoinPoint proceedingJoinPoint) 
      throws Throwable { 

     LOG.info("controller....before "); 
     return proceedingJoinPoint.proceed(); 

    } 

} 

中導入一個類之後發生錯誤配置「@Import(LoggerConfig.class)」到我的應用程序,並試圖運行它,我有fo llowing錯誤:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedServletContainerCustomizerBeanPostProcessor': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error Type referred to is not an annotation type: EnableHttpLogging 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:240) 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:697) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:526) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
    at com.olps.reassurance.cgoa.endpoint.manager.Application.main(Application.java:43) 
Caused by: java.lang.IllegalArgumentException: error Type referred to is not an annotation type: EnableHttpLogging 
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:193) 
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:170) 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:220) 
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:279) 
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:311) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:118) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:88) 
    at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:347) 
    at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:299) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) 
    ... 14 more 

回答

0

您需要修改的handleController方法簽名和內部@annotation提供的參數。下面顯示的示例應該可以工作。

@Aspect 
@Component 
@Slf4j 
public class LoggerAspect { 

    @Around("execution(* *(..)) && @annotation(annotation)") 
    public Object handleController(
      final ProceedingJoinPoint proceedingJoinPoint, 
      EnableHttpLogging annotation) 
      throws Throwable { 

     LOG.info("controller....before "); 
     return proceedingJoinPoint.proceed(); 

    } 

}