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

如何验证自定义AOP注释

皇甫聪
2023-03-14

我有一个自定义注释,如下所示

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Testable {
    int index();
}

我定义了一个方面来包装实际的方法调用

@Aspect
@Component
public class TestableAspect {

    @Around("execution(public * *(..)) && @annotation(annotation)")
    public Object invokeAndLog(ProceedingJoinPoint joinPoint, Testable annotation) throws Throwable {
        return joinPoint.proceed();
    }
}

注释的用法如下所示

@Testable(index = 1)
public void realMethod() {
    //some code here
}

到目前为止,这工作得很好,我可以在TestableAspect#InvkeAndLog中实现我的登录。

现在我需要验证eg的索引值不大于10。

我可以在运行时通过更改方面实现来实现,如下所示

    @Around("execution(public * *(..)) && @annotation(annotation)")
    public Object invokeAndLog(ProceedingJoinPoint joinPoint, Testable annotation) throws Throwable {
        if(annotation.index() > 10){
          throw new IllegalStateException("blah");
        }
        return joinPoint.proceed();
    }

但这需要至少调用一次API,而且效率不高。是否有一种方法可以在spring启动应用程序启动时执行此操作?

共有1个答案

金阳曜
2023-03-14

通常,您会编写注释处理器或类加载器来验证注释。否则,您可以尝试使用反射,如下所示:

new org.reflection.Reflections("your.desired.package").getFieldsAnnotatedWith(Testable.class)
            .stream()
            .map(method-> AnnotationUtils.getAnnotation(method, Testable.class))
            
            .forEach(annotation->{
                if(annotation.index() > 10){
                          throw new IllegalStateException("blah");
                 }

            });

这样的代码可以添加到任何类上的静态块中,或者如果您想使用spring,只需将其添加到[start-up runner][1]中即可。

这样的建议是不理想的,并附带扫描类路径的价格,但可以工作![1]:https://www.baeldung.com/running-setup-logic-on-startup-in-spring

 类似资料:
  • 我正在开发spring mvc应用程序,我应该在spring mvc validator的基础上应用验证。第一步,我为类和设置控制器添加了注释,效果很好。现在我需要实现自定义验证器来执行复杂的逻辑,但我想使用现有的注释并添加额外的检查。 我的用户类: 我的验证器: 我的控制器: 那么,有可能同时使用自定义验证器和注释吗?如果是,怎么做?

  • 主要内容:运行项目根据切入点表达式可能会将它们应用到其他不需要通知的其他。 例如,考虑以下表达式: 如果一个新的spring bean添加了方法,并且通知将开始应用到它,尽管它可能不需要应用通知。要实现不需要它,我们可以创建一个自定义注解并注解要应用到通知的方法。 要了解上面提到的关于的概念,现在我们来写一个实现的例子。打开并使用Eclipse IDE,并按照以下步骤创建一个Spring应用程序: 更新在Sprin

  • 表单验证发生在数据验证之后。如果你需要定制化这个过程,有几个不同的地方可以修改,每个地方的目的不一样。表单处理过程中要运行三种类别的验证方法。它们通常在你调用表单的is_valid() 方法时执行。还有其它方法可以触发验证过程(访问errors 属性或直接调用full_clean() ),但是通用情况下不需要。 一般情况下,如果处理的数据有问题,每个类别的验证方法都会引发ValidationErr

  • TLDR:我想要在单独的模块中单独的自定义bean验证定义及其ConstraintValidator实现。为此,我必须使用ConstraintMmap手动注册。它适用于带注释的类。但是定义的绑定不共享/可用于通过validation-constraints.xml.定义的验证如何修复?我试图调试它,以找出它在哪里初始化以及为什么会出现问题,但初始化这些远非易事。 动机: 一) 分离模块:如果API

  • 那里是自定义验证器: 当我调用时,我在插入的的上得到了一个。 我假设Spring会正确地注入定制验证器,我必须告诉他。但是,我不知道怎么做。我已经尝试了一些通过堆栈溢出和谷歌找到的东西,但没有运气。 任何帮助都将不胜感激。

  • 我正在开发一个java spring mvc应用程序。我已经实现了一个自定义的验证注释来验证某些字符串(例如)。这是我的注释体: 这是我的类: