当前位置: 首页 > 知识库问答 >
问题:

Spring AOP BeanCreationException由于“切入点中的形式未绑定”

宇文金鑫
2023-03-14

我对Spring AOP有问题。

我正在尝试在Spring MVC应用程序中实现方面。

我得到的错误是:

Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'org.springframework.cache.annotation.AnnotationCacheOperationSource#0':
Initialization of bean failed; nested exception is
  java.lang.IllegalArgumentException:
  error at ::0 formal unbound in pointcut 

是什么导致了这个问题?

在XML文件中,我有以下内容:

<aop:aspectj-autoproxy proxy-target-class="true"/>

我的方面类:

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class ApplicationMonitor {
    private static final Logger logger = Logger.getLogger(ApplicationMonitor.class);

    @Pointcut(value = "execution(* hr.mycompany.controller.impl.MyCompanyController.update(Object))") 
    public void updateMC(Object obj){}

    @Before(value="ApplicationMonitor.updateMC(Object)")
    public void beforeUpdateMC(JoinPoint jp) {
        Object obj = jp.getArgs()[0];
        logger.info("beforeUpdateMC " + obj);
    }
}

在pom中。xml文件我有以下依赖项:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.1.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjtools</artifactId>
        <version>1.8.10</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.10</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.10</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2</version>
    </dependency>

编辑(更改切入点后):

我改变了切入点,现在出现了如下错误:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [hr.mycompany.dao.IGenericHibernateDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}


09:11:27,871 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/BasicData-portlet]] (http--0.0.0.0-8083-2) StandardWrapper.Throwable: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'MyCompanyService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private hr.mycompany.dao.IGenericHibernateDao hr.mycompany.services.impl.MyCompanyService.vwObjectDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [hr.mycompany.dao.IGenericHibernateDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

我的应用程序有多个层和类,如下所示:

@Controller 
public class MyCompanyController implements IMyCompanyController{

    @Autowired
    private IMyComapnyService myCompanyService;

}


@Service
public class MyCompanyService implements IMyComapnyService {

    @Autowired
    private IGenericHibernateDao<Object, Integer>  vwObjectDao;

}

我试图为@Controller和@Service@Autowired方法提供建议。

共有1个答案

澹台冯浩
2023-03-14

用户heonlyrao提出了正确的建议,但使用了错误的切入点语法。您想这样做:

    @Pointcut("execution(* hr.mycompany.controller.impl.MyCompanyController.update(*)) && args(obj)") 
    public void updateMC(Object obj) {}

    @Before("updateMC(obj)")
    public void beforeUpdateMC(JoinPoint jp, Object obj) {
        // Not needed if parameter is bound via args()
        // Object obj = jp.getArgs()[0];
        logger.info("beforeUpdateMC " + obj);
    }

或者,与heonlyrao的建议类似,如果您不在多个建议中重复使用相同的切入点,您也可以将其内联:

    @Before("execution(* hr.mycompany.controller.impl.MyCompanyController.update(*)) && args(obj)")
    public void beforeUpdateMC(JoinPoint jp, Object obj) {
        // Not needed if parameter is bound via args()
        // Object obj = jp.getArgs()[0];
        logger.info("beforeUpdateMC " + obj);
    }

说明:您的错误消息显示:在切入点中正式未绑定。这意味着您在切入点和/或通知方法签名中使用了未反映在切入点中的形式参数,反之亦然。

 类似资料:
  • 主要内容:切入点,语法,运行项目切入点(JoinPoint)代表示您的应用程序中可以插入AOP方面的某个点。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,其中它用来执行通知。可以使用表达式或模式指定切入点,我们将在下面AOP示例中看到。 在Spring,切入点有助于使用特定的连接点来应用通知。

  • 问题是@before和@afterreturn有效,但对于pointcut却不是这样。

  • 主要内容:连接点,切入点,运行项目连接点 连接点()代表您的应用程序中可以插入AOP方面的一个点/位置。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,在其中应该执行的通知。 您可以使用表达式或模式指定切入点,我们将在AOP示例中看到。 在Spring中切入点有助于使用特定的连接点来应用通知。 请考

  • 我正在研究一个日志方面,它需要截获所有用自定义注释注释的类和方法。 下面是可以在类和方法上注释的自定义注释类: 我使用这些切入点表达式拦截带有注释的方法和类,这适用于所有简单类,但不适用于扩展或实现的类。 但是对而不是调用通知。 当对任何类或方法应用注释时,如何编写同时拦截对任何子类方法调用的切入点表达式?

  • 我正在使用vscode和Angular,我无法设置触发的断点。所有断点都设置为未绑定断点。 我的环境: 版本:1.64.2(用户设置)日期:2022-02-09T22:02:28.252Z电子:13.5.2Chromium:91.0.4472.164Node.js:14.16.0 V8: 9.1.269.39-电子.0 OS:Windows_NTx64 10.0.22000 我的发射。json }

  • 我在我的Scala项目中使用带有sbt-aspectj的AeyJ库。我正在尝试使用表达式编写: 但我有以下例外: 以下AspectJ教程介绍: 因此,通过注释样式,可以仅在@pointcut表达式中使用if()切入点。if()不能包含任何正文。然后,带注释的@切入点方法必须是公共静态布尔的形式,并且可以像往常一样使用形式绑定 可以在Scala方法上使用切入点中的if()表达式吗?