gpt4 book ai didi

java - 与接口(interface)上的注释匹配的 Spring AOP 切入点

转载 作者:IT老高 更新时间:2023-10-28 13:46:03 26 4
gpt4 key购买 nike

我有一个用 Java 6/Spring 3 实现的服务类,它需要一个注释来限制角色的访问。

我已经定义了一个名为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());
}
}

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

当我将注解放在 MyServiceImpl 中的方法上时,一切正常,切入点匹配并且切面启动。但是,我相信注解是服务契约(Contract)的一部分,应该与接口(interface)一起发布单独的 API 包。显然,我不想在服务定义和实现 (DRY) 上都添加注释。

我知道在 Spring AOP 中有些情况是由注释一个接口(interface)方法(例如事务)触发方面的。这里有什么特殊的语法,还是开箱即用是不可能的。

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

与:

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

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

希望对你有帮助!

关于java - 与接口(interface)上的注释匹配的 Spring AOP 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2847640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com