Spring AOP class 中没有可见的构造函数
Spring AOP No visible constructors in class
错误:java.lang.IllegalArgumentException: No visible constructors in class org.springframework.hateoas.config.HypermediaSupportBeanDefinitionRegistrar$DefaultObjectMapperCustomizer
大多数情况下,我使用了 , and the following code can be found at github repository
中给出的示例
注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface NeedTestClass {
}
看点:
@After("@args(NeedTestClass)")
public void afterReturningAtArgs() {
log.info("aspect: after @args {}");
}
服务:
@Slf4j
@Component
public class BusinessService {
public void logicWithAnnotatedArgs1(Child c) {
log.info("service");
}
}
Pojo(顶部class,不是子class):
@NoArgsConstructor // tried with or without
@NeedTestClass
public class Child {}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
@SpringBootTest
public class AopTest {
@Autowired
private BusinessService myBusinessService;
@Test
public void testAtArgsPCD() {
myBusinessService.logicWithAnnotatedArgs1(new Child());
}
我试图检查 aop 并注释 class 继承,但似乎第一步无法正常。我试过 @annotation() 和 this() PCD 都可以。
编辑:
到目前为止,我想知道错误可能与 bean 加载顺序有关。
您的 GitHub 项目甚至无法编译。你有没有测试过?首先通过反复试验,我必须添加所有这些依赖项:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba.druid</groupId>
<artifactId>druid-wrapper</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
接下来,我注意到 Maven 构建似乎没有启动本地 (127.0.0.1) 数据库,因为 Spring Boot 在启动时说:
(...)
2018-01-02 17:57:18.882 INFO 14480 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
2018-01-02 17:57:20.007 ERROR 14480 --- [tionPool-Create] com.alibaba.druid.pool.DruidDataSource : create connection error
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:590) ~[mysql-connector-java-6.0.6.jar:6.0.6]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:57) ~[mysql-connector-java-6.0.6.jar:6.0.6]
(...)
在我检查您的实际问题之前,您介意先将您的 GitHub 项目重构为 MCVE 吗?这样错误就不会重现了。
但是话虽如此,我确实在您的 POM 和 Java 文件中注意到了一些东西:也许问题不在您认为的地方。我可以看到您想将 Lombok 与 Spring AOP 结合使用。根据我的回答here,AspectJ和Lombok存在兼容性问题。也许它们也会影响 Spring AOP。那么你能不能在没有 @Slf4j
和其他 Lombok 东西的情况下暂时测试一下?一旦你修复了你的项目,我也可以自己测试。
GitHub repo 项目修复后更新:
现在我可以构建 运行 您的程序了,谢谢。似乎该参数以某种方式传递给您不希望定位的内部 Spring 类。所以只需像这样修改切入点:
@After("@args(com.example.demosm.my.aop.NeedTestClass) && within(com.example.demosm..*)")
错误:java.lang.IllegalArgumentException: No visible constructors in class org.springframework.hateoas.config.HypermediaSupportBeanDefinitionRegistrar$DefaultObjectMapperCustomizer
大多数情况下,我使用了
注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface NeedTestClass {
}
看点:
@After("@args(NeedTestClass)")
public void afterReturningAtArgs() {
log.info("aspect: after @args {}");
}
服务:
@Slf4j
@Component
public class BusinessService {
public void logicWithAnnotatedArgs1(Child c) {
log.info("service");
}
}
Pojo(顶部class,不是子class):
@NoArgsConstructor // tried with or without
@NeedTestClass
public class Child {}
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
@SpringBootTest
public class AopTest {
@Autowired
private BusinessService myBusinessService;
@Test
public void testAtArgsPCD() {
myBusinessService.logicWithAnnotatedArgs1(new Child());
}
我试图检查 aop 并注释 class 继承,但似乎第一步无法正常。我试过 @annotation() 和 this() PCD 都可以。
编辑: 到目前为止,我想知道错误可能与 bean 加载顺序有关。
您的 GitHub 项目甚至无法编译。你有没有测试过?首先通过反复试验,我必须添加所有这些依赖项:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<dependency>
<groupId>com.alibaba.druid</groupId>
<artifactId>druid-wrapper</artifactId>
<version>0.2.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
接下来,我注意到 Maven 构建似乎没有启动本地 (127.0.0.1) 数据库,因为 Spring Boot 在启动时说:
(...)
2018-01-02 17:57:18.882 INFO 14480 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
2018-01-02 17:57:20.007 ERROR 14480 --- [tionPool-Create] com.alibaba.druid.pool.DruidDataSource : create connection error
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:590) ~[mysql-connector-java-6.0.6.jar:6.0.6]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:57) ~[mysql-connector-java-6.0.6.jar:6.0.6]
(...)
在我检查您的实际问题之前,您介意先将您的 GitHub 项目重构为 MCVE 吗?这样错误就不会重现了。
但是话虽如此,我确实在您的 POM 和 Java 文件中注意到了一些东西:也许问题不在您认为的地方。我可以看到您想将 Lombok 与 Spring AOP 结合使用。根据我的回答here,AspectJ和Lombok存在兼容性问题。也许它们也会影响 Spring AOP。那么你能不能在没有 @Slf4j
和其他 Lombok 东西的情况下暂时测试一下?一旦你修复了你的项目,我也可以自己测试。
GitHub repo 项目修复后更新:
现在我可以构建 运行 您的程序了,谢谢。似乎该参数以某种方式传递给您不希望定位的内部 Spring 类。所以只需像这样修改切入点:
@After("@args(com.example.demosm.my.aop.NeedTestClass) && within(com.example.demosm..*)")