java.lang.IllegalStateException:无法识别每个子句:pmAspect

问题描述 投票:0回答:1

我的

<aop:aspectj-autoproxy/>
配置标签有问题。

我已经添加了 aspectjrt.jaraspectjweaver.jar,但我的设置仍然无法正常工作。

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.8.9</version>
</dependency>
<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.6.1</version>
</dependency>
org.springframework.context.support.AbstractApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ser' defined in file \[C:\\Users\\kunar\\eclipse-workspace\\Spring\\AopProj1\\target\\classes\\com\\krk\\service\\ServiceTest.class\]: BeanPostProcessor before instantiation of bean failed
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ser' defined in file \[C:\\Users\\kunar\\eclipse-workspace\\Spring\\AopProj1\\target\\classes\\com\\krk\\service\\ServiceTest.class\]: BeanPostProcessor before instantiation of bean failed
Caused by: java.lang.IllegalStateException: Per-clause not recognized: pmAspect
    at org.aspectj.internal.lang.reflect.AjTypeImpl.getPerClause(AjTypeImpl.java:183)
    at org.springframework.aop.aspectj.annotation.AspectMetadata.\<init\>(AspectMetadata.java:103)
@Component
@Aspect("pmAspect") 
public class AspectTest {
  @Around(value = "execution(int com.krk.service.ServiceTest.a*(..))")
  public Object around(ProceedingJoinPoint php) throws Throwable {
    System.out.println("before method call");
    Object ob=php.proceed();
    System.out.println("after method call");
    return ob;
  }
}
spring aspectj spring-aop aspectj-maven-plugin
1个回答
0
投票

你使用

@Aspect("pmAspect")
的方式显然是错误的。看起来好像你想命名方面,但你应该在
@Component
中进行命名,或者可能在
@Bean
中,如果出于某种原因在其他情况下你想在配置类中使用工厂方法。

如果您查看

@Aspect
javadoc,您会注意到
value
参数不是用于命名,而是用于指定实例化类型(如果您需要除单例方面之外的其他内容)。您不能只是将任何内容放入字符串参数中并简单地假设它将被解释为名称或标签。

因此,解决您的问题的方法是简单地使用

@Aspect
而不带任何参数。

还有一件事:您的 POM 中不需要同时使用 AspectJ 编织器和运行时。编织器已经包含运行时。您应该升级到更新的 AspectJ 版本,而不仅仅是从 WWW 复制并粘贴随机片段。最新版本是:

<dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.9.19</version>
</dependency>

但这不是问题的根本原因。

© www.soinside.com 2019 - 2024. All rights reserved.