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..*)")