Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringAOP-拦截其祖先具有注释的类_Java_Spring_Aop - Fatal编程技术网

Java SpringAOP-拦截其祖先具有注释的类

Java SpringAOP-拦截其祖先具有注释的类,java,spring,aop,Java,Spring,Aop,我有以下层次结构: @Validated public class 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

我有以下层次结构:

@Validated
public class 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
@heritated
注释
当我用
@Validated
注释
devicesource
时,它工作正常。如何在
devicesource
中让aspect拦截我的方法,而不使用
@Validated
对其进行注释

谢谢

阿米尔

是不正确的,应该是

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

我最终通过更改我的方面中的切入点表达式解决了这个问题:

@Before("within(com.redbend..*) && within(@com.redbend.validation.annotation.Validated *)")
我仍然不知道为什么它以前不工作,或者为什么(com.redbend.validation.annotation.Validated)中的
@in(com.redbend.validation.annotation.Validated)

不起作用…

我尝试了你的建议,但得到了以下错误:引用的错误类型不是批注类型:com$redbend$validation$annotation$Validated您应该将其设置为批注:)您可以按原样共享已验证的类(包括包声明)吗?(我已经测试了我写的东西,所以它会工作)我的注释是这样的:
package hu.bbako.ecm;导入java.lang.annotation.ElementType;导入java.lang.annotation.Inherited;导入java.lang.annotation.Retention;导入java.lang.annotation.RetentionPolicy;导入java.lang.annotation.Target@继承的@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public@interface InheritableAnnotation{}
我在您的批注中更改了一件事,它成功了。我的ClasssPath上没有javax.inject.Scope,所以我使用了
import org.springframework.context.annotation.Scope我删除了作用域,但仍然不起作用。。。我发布了我的aspect类,可能是我做错了什么…和以前一样的错误(
com$redbend$validation$annotation$Validated
)?您可能需要对项目进行清理/构建,因为这应该是可行的。我复制了你的advise类,这里没有错误。
@within(com.redbend.validation.annotation.Validated)
@Before("within(com.redbend..*) && within(@com.redbend.validation.annotation.Validated *)")