Проверьте аргументы для всех аннотированных методов во время выполнения - PullRequest
0 голосов
/ 04 октября 2011

Как выполнить проверку во время запуска для всех случаев использования аннотации?

Например, у меня есть этот аспект, который применяется к методам, отмеченным @Protect, который применяет некоторую политику безопасности. Во всей системе у нас есть методы, отмеченные @Protect("valid-operation-1"), @Protect("valid-operation-2") или @Protect("INVALID-operation"). Как только приложение запустится, я хотел бы проверить аргументы, предоставленные для всех этих аннотаций, чтобы обнаружить такие неправильные конфигурации.

В частности, я проверю, определен ли bean-компонент в контексте приложения Spring, идентификатор которого соответствует аргументу аннотации. Это означает, что для защиты метода void drive() я буду аннотировать @Protect("drive") и ожидать, что bean-компонент protect_drive будет присутствовать в контексте приложения.

Вы можете просто подождать, пока метод будет вызван, затем вызывается совет, и вы проверяете аргумент. Тогда вы увидите, что INVALID-operation неправильно определено. Но это слишком поздно .

Можно ли проверить это для всех аннотированных методов при запуске приложения?

1 Ответ

0 голосов
/ 05 октября 2011

Если классы, которые вы хотите проверить, являются Spring Beans, тогда вы можете использовать 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);        

    } 
...