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

我有一个在Java 6 / Spring 3中实现的服务类,该服务类需要注释以按角色限制访问。

我定义了一个名为RequiredPermission的注释,该注释具有一个名为OperationType的枚举中的一个或多个值作为其value属性:

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());

}

}

参数对象包含一个用户名,在允许访问该方法之前,我想为用户查找所需的角色。

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

我知道在Spring AOP中,某些情况是通过一种接口方法(例如,事务性)的注释来触发的。这里是否有特殊的语法,还是开箱即用根本不可能。

PS:我尚未发布我的spring config,因为它似乎工作正常。不,这些既不是我的原始类也不是方法名称。

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.*(..))

与:

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

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

希望对你有所帮助!

以上是 与接口上的注释匹配的Spring AOP切入点 的全部内容, 来源链接: utcz.com/qa/422518.html

回到顶部