Spring AOP类中没有可见的构造函数

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

错误:java.lang.IllegalArgumentException: No visible constructors in class org.springframework.hateoas.config.HypermediaSupportBeanDefinitionRegistrar$DefaultObjectMapperCustomizer

大多数情况下,我使用了link中给出的示例,以下代码可以在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(顶级,不是子类):

@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和带注释的类继承,但似乎第一步可能不行。我试过@annotation()和这个()PCD都没关系。

编辑:到目前为止,我想知道错误可能与bean加载序列有关。

spring-aop
1个回答
2
投票

你的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和其他龙目岛的东西吗?一旦你修复了你的项目,我也可以自己测试。


GitHub repo项目修复后更新:

现在,我可以构建并运行您的程序,谢谢。似乎参数以某种方式传递给您不希望定位的内部Spring类。所以只需像这样修改你的切入点:

@After("@args(com.example.demosm.my.aop.NeedTestClass) && within(com.example.demosm..*)")
© www.soinside.com 2019 - 2024. All rights reserved.