0

次の階層があります。

@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
DeviceResource@ValidatedDeviceResource@Validated

ありがとう、

アミール

4

2 に答える 2

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

は正しくありません。

@within(com.redbend.validation.annotation.Validated)
于 2013-06-04T12:15:01.480 に答える
0

最終的には、アスペクトのポイントカット式を変更して解決しました。

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

なぜ以前はうまくいかなかったのか、なぜ@within(com.redbend.validation.annotation.Validated) うまくいかなかったのかはまだわかりません...

于 2013-06-05T10:50:35.677 に答える