[Spring Java JSP SSH ] spring拦截annotation的问题

Aaron5 2011-01-30
    最近写了个自定义的annotation。想用spring的aop拦截并解析出annotation的值。
    但是,发现只能解析到接口的annotation,不能解析到实现类的annotation。这是为什么呢?
   
    annotation定义代码如下:
@Target(ElementType.METHOD)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
public @interface MyTest {   
    public String value() default "Hello World!";   
}  


   业务实现类代码为:
@Service("bo")
public class BusinessServiceImp implements BusinessService{
	
	@MyTest("test annotation")
	public String update(){
		System.out.println("update data!");
		return "update return value!";
	}
	
	public void delete(){
		System.out.println("delete data!");
	}
}

   
    AOP的around方法为:
public Object around(ProceedingJoinPoint pjp) throws Throwable{
		System.out.println("环绕通知前");
		MethodSignature joinPointObject = (MethodSignature) pjp.getSignature();
		Method method = joinPointObject.getMethod();  
		boolean flag = method.isAnnotationPresent(MyTest.class) ;   
		if(flag){   
			MyTest annotation2 = method.getAnnotation(MyTest.class);  
			System.out.println(method.getName() + "方法上的注解:");
			System.out.println(annotation2.annotationType().getCanonicalName() + " : " + annotation2.value()+"\t");   
		}  
		Object obj = pjp.proceed();
		System.out.println("环绕通知后");
		
		return obj;
	}

   
    通过around的ProceedingJoinPoint对象获取到Method对象。可是获取到的Method对象似乎不是实现类的Method对象,因而解析不出annotation。这是为什么呢?

Aaron5 2011-01-30
    如果将注解放在接口中,将能解析出annotation。
   
    业务接口定义:
public interface BusinessService {
	//这里的annotation可以获取到。实现类中的却不能获取到。这就是问题所在。纠结啊。
        @MyTest("test annotation")
	public String update();
	
	public void delete();
}
www88485400 2011-08-10
不用纠结了 因为你是居于接口的编程, 面向的就是接口 所以你只能发现接口的Anntation
如果你不是面向接口的 哪结果就不一样了。 你不妨做一个测试。 他找的时候应该是根据接口查找的。
zhouqiugang 2011-09-16
你些的是通过代理接口得到方法的
你可以这样拿类的方法
Method method = pjp.getTarget().getClass().getMethod(joinPointObject.getName, joinPointObject.getParameterTyeps())
Global site tag (gtag.js) - Google Analytics