Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与接口上的注释匹配的Spring AOP切入点_Java_Spring_Aop_Aspectj_Pointcut - Fatal编程技术网

Java 与接口上的注释匹配的Spring AOP切入点

Java 与接口上的注释匹配的Spring AOP切入点,java,spring,aop,aspectj,pointcut,Java,Spring,Aop,Aspectj,Pointcut,我在Java6/Spring3中实现了一个服务类,它需要一个注释来限制角色的访问 我定义了一个名为RequiredPermission的批注,该批注的值属性是来自名为OperationType的枚举的一个或多个值: public @interface RequiredPermission { /** * One or more {@link OperationType}s that map to the permissions required * to execute this meth

我在Java6/Spring3中实现了一个服务类,它需要一个注释来限制角色的访问

我定义了一个名为RequiredPermission的批注,该批注的值属性是来自名为OperationType的枚举的一个或多个值:

public @interface RequiredPermission {

/**
 * One or more {@link OperationType}s that map to the permissions required
 * to execute this method.
 * 
 * @return
 */
OperationType[] value();}

public enum OperationType {
      TYPE1,
      TYPE2;
}

package com.mycompany.myservice;
public interface MyService{
   @RequiredPermission(OperationType.TYPE1)
   void myMethod( MyParameterObject obj );
}

package com.mycompany.myserviceimpl;
public class MyServiceImpl implements MyService{
   public myMethod( MyParameterObject obj ){
       // do stuff here
   }
}
我还有以下方面的定义:

/**
 * Security advice around methods that are annotated with
 * {@link RequiredPermission}.
 * 
 * @param pjp
 * @param param
 * @param requiredPermission
 * @return
 * @throws Throwable
 */
@Around(value = "execution(public *"
        + " com.mycompany.myserviceimpl.*(..))"
        + " && args(param)" + // parameter object
        " && @annotation( requiredPermission )" // permission annotation

, argNames = "param,requiredPermission")
public Object processRequest(final ProceedingJoinPoint pjp,
        final MyParameterObject param,
        final RequiredPermission requiredPermission) throws Throwable {
    if(userService.userHasRoles(param.getUsername(),requiredPermission.values()){
        return pjp.proceed();
    }else{
        throw new SorryButYouAreNotAllowedToDoThatException(
            param.getUsername(),requiredPermission.value());
    }
}
parameter对象包含用户名,我希望在允许访问该方法之前查找该用户所需的角色

当我在MyServiceImpl中的方法上添加注释时,一切都正常工作,切入点匹配,方面生效。但是,我认为注释是服务合同的一部分,应该在单独的API包中与接口一起发布。显然,我不想将注释放在服务定义和实现(DRY)上

我知道在SpringAOP中,有些情况下方面是由一个接口方法(例如事务)触发的。这里有没有一种特殊的语法,或者说是完全不可能开箱即用

PS:我还没有发布我的spring配置,因为它似乎工作得很好。不,这些不是我的原始类或方法名

PPS:实际上,这是我的spring配置的相关部分:

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

<bean class="com.mycompany.aspect.MyAspect">
    <property name="userService" ref="userService" />
</bean>

如果我理解您的意思是正确的,那么您需要一个切入点,它可以找到扩展MyService的类中的所有方法,并带有注释和首选参数

我建议你取代:

execution(public * com.mycompany.myserviceimpl.*(..))
与:

如果希望连接点与MyService类或扩展它的类匹配,则使用加号


我希望有帮助

Espen,您的代码仅适用于一个类:

execution(public * com.mycompany.myservice.MyService+.*(..))

但是,如果我希望*com.mycompany.services.**包中的所有服务都有这种行为,该怎么办?

有一个小错误。它实际上是:execution(public*com.mycompany.myservice.myservice+.*(..),但它就像一个符咒。谢谢!!!太好了!我将更正我的答案,在所有方法中也包括一个通配符。我后来意识到这并不完全正确(尽管这可能是最好的选择)。我希望注释位于服务接口方法上,但这仅在注释位于实现方法上时有效。由于我还需要这种行为:,我必须保持切入点最小,并亲自检查proceedingjoinpoint对象。这工作正常:执行(public*com.mycompany.myservice.*+.*(…)。因此,如果我理解正确,您为原始问题找到的最佳解决方案(即,在接口中有注释,而不是在实现中)是否要匹配服务提供者接口的整个包,然后在ProceedingJoinPoint上进行内省,以找出接口中方法的注释?这可能吗?这是一个很好的线程,我不想用同样的问题开始一个新的线程!谢谢@实际上,我非常沮丧,我将所有注释从接口复制到实现类,并通过严格的单元测试来执行,该测试检查接口和实现类上的所有方法是否有相同的注释。不完全是AOP,我知道。毕竟,我得说它工作不可靠
execution(public * com.mycompany.myservice.MyService+.*(..))