【问题标题】:Check the arguments for all annotated methods at runtime在运行时检查所有带注释的方法的参数
【发布时间】:2011-10-04 14:58:44
【问题描述】:

如何在启动时检查注解的所有使用情况?

例如,我有这个方面,它应用于使用@Protect 注释的方法,它应用了一些安全策略。在整个系统中,我们有用@Protect("valid-operation-1")@Protect("valid-operation-2")@Protect("INVALID-operation") 注释的方法。应用程序启动后,我想检查为所有这些注释提供的参数,以检测此类错误配置。

特别是,我将检查我们是否在 Spring 应用程序上下文中定义了一个 bean,其 ID 与注解的参数匹配。这意味着,为了保护 void drive() 方法,我将使用 @Protect("drive") 进行注释,并期望 bean protect_drive 出现在应用程序上下文中。

您可以轻松地等到方法被调用,然后调用通知,然后检查参数。然后你会看到INVALID-operation 的定义是错误的。但这为时已晚

是否可以在应用程序启动时检查所有带注释的方法?

【问题讨论】:

  • 这将要求您在启动时加载所有这些类。对启动时间的影响是否可以接受?
  • 您能否对“操作”字符串的性质提供一些见解?你对他们有什么控制权?例如,它们是否可以被限制为有效的 Java 名称(没有破折号等)?是否有一组在整个系统中全局有效的?可以将此集合编译为枚举 - 然后在您的@Protect 中使用枚举值吗?等等……
  • Ed,我更新了这个问题,澄清了注释的论点。我无法控制他们。启动时间可能需要很长时间,这不是问题。但是你在那里提出了一个有趣的观点。另一方面,您可以访问切入点表达式并执行与 AspectJ 引擎相同的搜索,我认为这很便宜。

标签: java spring annotations aspectj interceptor


【解决方案1】:

如果您要检查的类是 Spring Bean,那么您可以使用 BeanPostProcessor

public class OnlyAScratchForAnPostProcessor {

    @Inject
    private ApplicationContext context;


    @Override
    public Object postProcessAfterInitialization(final Object bean,
        final String beanName) throws BeansException {

          ReflectionUtils.doWithMethods(bean.getClass(), new MethodCallback() {

             @Override
             public void doWith(Method method) throws IllegalArgumentException,
                         IllegalAccessException {

                  String expecedNameFromAnnotation = scanAnnotation(method);
                  if(expecedNameFromAnnotation != null) {
                      if(context.beanByName(expecedNameFromAnnotation) != null) {
                         throw new RuntimeException("illegal configuration");
                      }
                  }         
             }

             String scanAnnotation(Method method){...}

          }, ReflectionUtils.USER_DECLARED_METHODS);        

    } 

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多