当前位置: 首页 > 面试题库 >

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

徐学潞
2023-03-14
问题内容

我有一个在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类或扩展它的类,则使用加号。

希望对您有所帮助!



 类似资料:
  • 假设我有一个注释,如下所示: 然后在Aspect中,我怎么可能想写两个切入点,一个用于所有用@DB操作(isRead操作=true)注释的方法,一个用于@DB操作(isRead操作=false)?

  • 我想使用ElementType运行一个方面。参数注释,但它不起作用。从不调用about-tokenize方法。

  • 我有一个使用< code>Process注释定义的流程。此批注具有名为< code>name的属性。流程中包含任务。这些任务是用另一个名为< code>Task的注释定义的。此批注具有属性< code>processName。我有一个将< code>name作为泛型的泛型流程。此流程的任务是任务1、任务2和任务3,这三个任务都将< code>processName作为通用任务。我可以使用aspec

  • 问题内容: 如果满足以下条件,则需要创建一个与方法匹配的切入点的方面: 它用MyAnnotationForMethod注释 它的参数之一(可以有多个)用@MyAnnotationForParam注释(但也可以具有其他注释)。 方面类看起来像这样 注释方法 随着日食->警告:在poincut: 使用http://download.eclipse.org/tools/ajdt/35/update中的最

  • 问题内容: 我无法弄清楚能够注释Java接口的用例。 也许有人可以给我一个例子? 问题答案: 我在Spring中使用它来注释接口,其中注释应应用于所有子类。例如,假设您有一个Service接口,并且您可能具有该接口的多个实现,但是无论是否有注释,都希望应用安全注释。在这种情况下,对接口进行注释最有意义。

  • 我试图拦截一个用JAX-RS@POST标注的接口方法。我的切入点适用于所有非接口方法,如果@POST-注释直接位于被调用的方法。 拦截的接口方法: 要匹配方法的PointCut: 接口在v1com.myapp.social.webapi.包中,即使我将方法更改为公共AeyJ也不会拦截调用。 在我的切入点内有什么需要改变的吗?我怎样才能让它工作?