论坛首页 Java版 Spring

Java6环境下Spring2.5.4 AOP的问题

浏览 715 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
时间:2008-05-26

最近一个崭新的项目使用了Java6,但在使用spring2.5.4的时候碰到了问题,下面是异常:

 Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourceService' defined in class path resource [com/xxx/aop/aop.xml]: Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut logReturnVal
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:485)
 at java.security.AccessController.doPrivileged(Native Method)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
 at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:251)
 at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:248)
 at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:170)
 at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:413)
 at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:735)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
 at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:122)
 at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:66)
 at com.xxx.aop.Test.main(Test.java:12)
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut logReturnVal
 at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:315)
 at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:197)
 at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:184)
 at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:165)
 at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:189)
 at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:244)
 at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:278)
 at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:113)
 at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:85)
 at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:66)
 at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:296)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:334)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1368)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540)
 ... 13 more

但切换到Java5下就没有问题了,代码如下:

package com.xxx.aop;

public interface ResourceService {
  public String findResource(int resId);
}

package com.xxx.aop;

public class ResourceServiceImpl implements ResourceService {

  public String findResource(int resId) {
    return "Resource: " + resId;
  }
}


package com.xxx.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class LogPointCut {
  
  @Pointcut("execution(public * com.xxx.aop.ResourceServiceImpl.findResource(..))")
  public void logReturnVal(){}
}

package com.xxx.aop;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class LogAspect {
  @AfterReturning(pointcut="com.xxx.aop.LogPointCut.logReturnVal()", returning="retVal")
  public void afterReturn(String retVal){
    System.out.println("Return:" + retVal);
  }
}

package com.xxx.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

  /**
   * @param args
   */
  public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/xxx/aop/aop.xml");
    
    ResourceService service = (ResourceService) context.getBean("resourceService");
    
    service.findResource(10);
  }

}

 

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd" default-autowire="byName">

	<aop:aspectj-autoproxy/>
	<bean id="resourceService" class="com.xxx.aop.ResourceServiceImpl" />

	<bean class="com.xxx.aop.LogAspect" />

</beans>

 

完整代码见附件,由于不想换成Java5了,所以请教怎么在Java6中解决上述问题。

  • AOP.rar (1.8 KB)
  • 描述:
  • 下载次数: 20
   
时间:2008-05-29
@Pointcut("execution(public * com.xxx.aop.ResourceServiceImpl.findResource(..))")
改为
@Pointcut("execution(public * com.xxx.aop.ResourceService.findResource(..))")

指向接口。我一试果然行了。虽然我spring二流,Annotation没入门,这个问题还真难。哇咔咔!
   
0 请登录后投票
时间:2008-05-30
默认delegating接口
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐