java - 由于“切入点中的正式未绑定”,Spring AOP BeanCreationException
问题描述
我对 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 方法提供建议。
解决方案
用户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);
}
说明:您的错误消息说:formal unbound in pointcut
。这意味着您在切入点和/或建议方法签名中使用了一个形式参数,该签名未反映在切入点中,反之亦然。
推荐阅读
- javascript - Todo React JS 应用程序 1
- django - Django LoginView 的success_url?
- javascript - 使用 AJAX 的下拉菜单
- java - 表示类中的数学运算符
- php - Angular ng-click 不起作用-后台问题
- javascript - 如何在不同文件的 JavaScript 中使用来自 PHP 脚本的信息?
- php - “字段条目”中的未知列
- ruby - Ruby 双向字符串缓冲区
- python - Django-summernote 工作正常,但显示带有 HTML 标记的文本
- c++ - SFINAE : 删除具有相同原型的函数