当前位置: 首页 > 知识库问答 >
问题:

如何在spring aspect中访问定制注释值

宗冠宇
2023-03-14

我正在尝试从jointCut访问自定义注释值。但是我找不到方法。

我的示例代码:

@ComponentValidation(input1="input1", typeOfRule="validation", logger=Log.EXCEPTION)
public boolean validator(Map<String,String> mapStr) {
    //blah blah
}

正在尝试访问< code>@Aspect类。

但是,我没有看到任何访问值的范围。

我试图访问的方式在代码下面

CodeSignature codeSignature = (CodeSignature) joinPoint.getSignature(); 
String[] names = codeSignature.getParameterNames();
MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
Annotation[][] annotations = methodSignature.getMethod().getParameterAnnotations();
Object[] values = joinPoint.getArgs();

我没有看到任何值返回input = input1。如何实现这一点。

共有3个答案

蔺翰音
2023-03-14

例如,如果您在注释接口中定义了一个方法,如下所示:

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface AspectParameter {
    String passArgument() default "";
}

然后,您可以通过以下方式访问类和方法值:

@Slf4j
@Aspect
@Component
public class ParameterAspect {

    @Before("@annotation(AspectParameter)")
    public void validateInternalService(JoinPoint joinPoint, AspectParameter aspectParameter) throws Throwable {    
        String customParameter = aspectParameter.passArgument();
    }
}
樊奇思
2023-03-14

要获取值,请使用以下命令:

ComponentValidation validation = methodSignature.getMethod().getAnnotation(ComponentValidation.class);

您可以调用validation.getInput1(),假设您在ComponentValization自定义注释中有此方法。

锺离德运
2023-03-14

虽然从简单的Java角度来看,贾马·阿萨蒂利亚耶夫的答案是正确的,但它涉及反思。

但是这个问题是专门关于Spring AOP或AeyJ的,并且有一种更简单、更规范的方法可以将匹配的注释绑定到使用AeyJ语法的方面建议参数——顺便说一句,没有任何反射

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

import my.package.ComponentValidation;

@Aspect
public class MyAspect {
    @Before("@annotation(validation)")
    public void myAdvice(JoinPoint thisJoinPoint, ComponentValidation validation) {
        System.out.println(thisJoinPoint + " -> " + validation);
    }
}
 类似资料:
  • 问题内容: 我有以下Java代码- 我得到的错误是 如何正确访问注释字段? 问题答案: 默认情况下,注释在运行时不可用。您需要添加到注释定义以使其可用于运行时处理。例如: 在实践中,还应在实际尝试从字段中删除注释之前,检查该字段是否确实具有给定的注释。 另外,指定注释所属的元素类型也是一种好习惯。因此,您的示例将是:

  • 问题内容: 是否可以通过注释处理器访问带有注释的元素? 是否可以通过注释处理器访问带注释的类型边界? 高度赞赏我错过的相关文档的链接。 内容: 注释: 一个示例类: 处理器: 在classpath 上使用编译以上内容将显示消息,但永远不会调用该方法。当方法参数中存在注释时,使用注释向处理器添加另一个注释可以正常工作。如果方法参数带有注释,则过程将再次忽略该元素。 问题答案: 该注释是有点棘手,因为

  • 问题内容: 是否可以访问字段值,该字段名在注释中描述,该注释在类中注释了另一个字段。 例如: 注解: 现在,是否可以从ConstraintValidator实现类中的User类访问字段密码? 编辑: 我写了这样的东西: 现在的问题是如何获取用户对象实例并比较字段值? 问题答案: 您或者需要编写一个类级别的约束,以便在其中将完整的 User 实例传递给 isValid 调用,或者可以使用类似 @Sc

  • 是否可以访问一个字段值,其中字段名在批注中描述,批注类中的另一个字段。 例如: 注释: 我写了这样的东西: 现在的问题是如何获取用户对象实例并比较字段值?

  • 问题内容: 如果一个类定义了一个注释,是否有可能迫使其子类定义相同的注释? 例如,我们有一个简单的类/子类对,它们共享 我想做的事情,就是迫使每个进一步的子类定义相同的注释,以防止将来出现问题。 TestClass.java: TestSubClass.java: 我知道我可以在运行时枚举所有批注并检查是否丢失了,但是我真的很想在编译时执行此操作(如果可能)。 问题答案: 您可以在编译时使用JSR

  • JAXB为每个属性生成@XmlAttribute注释。例如,属性 转换为带注释的java对象属性 但是,如果属性在名称中没有下划线,则@Xml属性中的名称字段丢失(因此##默认)。我想自定义JAXB绑定,以便也生成没有下划线的名称的注释。有什么建议吗? 谢谢!Johannes