【问题标题】:Spring AOP - Intercepting a class that its ancestor has an annotationSpring AOP - 拦截其祖先具有注释的类
【发布时间】:2013-06-04 12:11:16
【问题描述】:

我有以下层次结构:

@Validated
public class BaseResource 

和

public class DeviceResource extends BaseResource

@Validated注解如下:

package com.redbend.validation.annotation;

import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.inject.Scope;



@Scope
@Target(TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Validated {

}

我有以下建议:

    package com.redbend.validation.aspect;

import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.Map;

import javax.validation.constraints.NotNull;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import com.redbend.exceptions.EExceptionMsgID;
import com.redbend.exceptions.runtime.MissingMandatoryParameterException;
import com.redbend.validation.annotation.MandatoryOneOfParams;
import com.redbend.validation.annotation.MandatoryParams;
import com.redbend.validation.annotation.NotEmpty;
import com.redbend.validation.annotation.OneOfParamsForValue;
import com.redbend.validation.annotation.OneOfParamsForValueMap;
import com.redbend.validation.annotation.ParamsForValue;
import com.redbend.validation.annotation.ParamsForValueMap;

@Aspect
@Component
@Order(2)


public class ValidationInterceptor {

    private static Logger logger = LoggerFactory.getLogger(ValidationInterceptor.class);

    public ValidationInterceptor() {
        // TODO Auto-generated constructor stub
    }

    @Before("within(com.redbend..*) && @within(com.redbend.validation.annotation.Validated) ")
    public void validate(JoinPoint joinPoint) throws Exception {
        validateParams(joinPoint);
    }

当我在DeviceResource中调用一个方法时,它并没有被切面捕获,甚至认为它继承自BaseResource,@Validated注释,@Validated被@Inherited注释。
当我用@Validated 注释DeviceResource 时,它工作正常。如何让切面拦截我在DeviceResource 中的方法而不用@Validated 对其进行注释?

谢谢,

阿米尔

【问题讨论】:

    标签: java spring aop


    【解决方案1】:
    within(@com.redbend.validation.annotation.Validated)
    

    不正确,应该是

    @within(com.redbend.validation.annotation.Validated)
    

    【讨论】:

    • 我试过你的建议,我得到以下错误:错误类型不是注释类型:com$redbend$validation$annotation$Validated
    • 你应该把它变成一个注解:) 你能按原样分享 Validated 类(包括包声明)吗? (我已经测试了我写的东西,所以它会工作)我的注释是这样的:package hu.bbako.ecm; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Inherited @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface InheritableAnnotation { }
    • 我在您的注释中更改了 1 件事并且它有效。我的 ClasssPath 上没有 javax.inject.Scope,所以我使用了import org.springframework.context.annotation.Scope;
    • 我删除了 Scope,但仍然无法正常工作...我发布了我的方面类,也许我在那里做错了什么...
    • 和以前一样的错误(com$redbend$validation$annotation$Validated)?您可能需要对您的项目进行清理/构建,因为这应该可以。我复制了你的建议类,这里没有错误。
    【解决方案2】:

    我最终通过在我的方面改变切入点表达式来解决它:

    @Before("within(com.redbend..*) && within(@com.redbend.validation.annotation.Validated *)")
    

    我仍然不知道为什么它以前不起作用或为什么@within(com.redbend.validation.annotation.Validated) 没用...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多