我有以下课程。

我在服务类中将someDao自动布线为@Autowired SomeDao someDao
我称服务中的逻辑为someDao.getName(2);

SomeServiceImpl.java

public class SomeServiceImpl{

@Autowired SomeDao someDao
//call dao methods using someDao
}


SomeDao.java

public  interface SomeDao{

 String getName(Int id);
}


SomeDaoImpl.java

public class SomeDaoImpl implements SomeDao{

 @CustomAnnotation("somevalue")
 public String getName(int id){
   //logic

  }


}


SomeAspect.java

@Around("execution(public * *(..)) && @annotation(com.mycompany.CustomAnnotation)")
    public Object procedeNext(ProceedingJoinPoint call) throws Throwable {

  //Access annotation value
        MethodSignature signature = (MethodSignature) call.getSignature();
        Method method = signature.getMethod();
        CustomAnnotation myAnnotation =   method.getAnnotation(CustomAnnotation.class);
        String name = myAnnotation.value();
            //here i am expecting name value "somevalue" but it is returning null


}


CustomAnnotation具有@Retention(RetentionPolicy.RUNTIME)

在上述方面,String name = myAnnotation.value();应该给我somevalue,但是它给了null。有什么建议吗?但是,如果我在接口中保留@CustomAnnotation("somevalue"),那么它会带来价值。注释接口方法好吗?

最佳答案

这是因为默认的spring APO代理从接口而不是从类获取方法。因此,当方法调用是接口调用而不是类调用时。

您有几种选择:

1.您将xml配置更改为<aop:config proxy-target-class="true">,并且它应该可以工作,因为代理将获取类而不是接口。如果您有多个xml aop配置,并且其中一个以目标类为目标,则所有它们都将执行相同操作,因此请小心。

2.或者您坚持使用默认值,然后将注释放在界面上。只要注意注释,该方法就可以很好地工作。特别是如果您有交易。

3.可能还有另一种解决方法,使用方法调用使用ClassUtils获取目标类,以使该类位于代理接口的后面,但我对此并没有做太多研究。

希望这可以帮助

10-08 01:25