与接口上的注释匹配的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