Point-cut & ldquo; After & rdquo; не работает для защищенного метода в контроллере [duplicate]

Преобразовать файл в base64, используя | HTML5 readAsDataURL () или некоторый кодер base64 . Здесь скрипт

var reader = new FileReader();

        reader.onload = function(readerEvt) {
            var binaryString = readerEvt.target.result;
            document.getElementById("base64textarea").value = btoa(binaryString);
        };

        reader.readAsBinaryString(file);

Затем для извлечения:

window.open("data:application/octet-stream;base64," + base64);

32
задан Anand 26 November 2012 в 14:13
поделиться

6 ответов

Аспект применяется к прокси , окружающему компонент. Обратите внимание, что каждый раз, когда вы получаете ссылку на bean-компонент, на самом деле это не класс, на который ссылается ваша конфигурация, а синтетический класс, реализующий соответствующие интерфейсы, делегируя фактический класс и добавляя функциональность, например, ваш AOP.

В приведенном выше примере вы вызываете непосредственно в классе, тогда как если этот экземпляр класса вводится в другой как компонент Spring, он вводится как его прокси-сервер, и, следовательно, вызовы методов будут вызваны на прокси (и аспекты будут активированы)

Если вы хотите достичь вышеизложенного, вы можете разделить method1 / method2 на отдельные компоненты или использовать структуру AOP, не ориентированную на весы.

Подробное описание Spring doc и несколько обходных решений (включая мое первое предложение выше)

40
ответ дан M. Deinum 28 August 2018 в 09:54
поделиться

Используя @Autowired, он работает. Вместо вызова внутреннего метода как this.method() вы можете сделать:

@Autowired
Foo foo;

, а затем вызывать:

foo.method2();
2
ответ дан Jobin 28 August 2018 в 09:54
поделиться

Это можно сделать путем использования собственной инъекции. Вы можете вызвать внутренний метод через инъецируемый экземпляр:

@Component
public class Foo {
    @Resource
    private Foo foo;

    public void method1(){
        ..
        foo.method2();
        ..
    }
    public void method2(){
        ..
    }
}

Начиная с Spring 4.3 вы также можете сделать это с помощью @Autowired.

Начиная с 4.3, @Autowired также учитывает ссылки для инъекций, т. е. ссылки на компонент, который в настоящее время вводится.

25
ответ дан Konstantin Zyubin 28 August 2018 в 09:54
поделиться

У меня была такая же проблема, и я преодолел реализацию Spring ApplicationContextAware, BeanNameAware и выполнил соответствующие методы, как показано ниже.

class ABC implements ApplicationContextAware,BeanNameAware{

      @Override
      public void setApplicationContext(ApplicationContext ac) throws BeansException {
          applicationContext=ac;
      }

      @Override
      public void setBeanName(String beanName) {
          this.beanName=beanName;
      }
      private ApplicationContext applicationContext;
      private String beanName;
}

, после чего я заменил this. на ((ABC) applicationContext.getBean(beanName)). вызывая методы одного и того же класса. Это гарантирует, что вызовы методов одного и того же класса происходят только через прокси.

Таким образом, method1() изменяется на

 public void method1(){
    .........
    ((ABC) applicationContext.getBean(beanName)).method2();
    ...........
  }

Надеюсь, что это поможет.

4
ответ дан pavan 28 August 2018 в 09:54
поделиться

Spring AOP framework основан на «прокси» и здесь очень хорошо объясняется: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/aop. html # aop-understanding-aop-proxies

Когда Spring создает компонент, который настроен на аспект (например, «ABC» в вашем примере), он фактически создает объект «прокси», который действует как настоящий боб. Прокси просто делегирует вызовы «реальному» объекту, но, создав это косвенное действие, прокси получает возможность реализовать «совет». Например, ваш совет может регистрировать сообщение для каждого вызова метода. В этой схеме, если метод в реальном объекте («метод1») вызывает другие методы в одном и том же объекте (скажем, метод2), эти вызовы происходят без прокси на картинке, поэтому нет никаких шансов для реализации каких-либо советов.

В вашем примере, когда вызывается метод1 (), прокси получит возможность делать то, что он должен делать, но если метод1 () вызывает метод2 (), на картинке нет никакого аспекта , Как бы то ни было, если метод2 вызывается из какого-либо другого компонента, прокси сможет выполнить совет.

Надеюсь, это поможет.

Спасибо, Рагу

2
ответ дан Raghuram 28 August 2018 в 09:54
поделиться

Невозможно, чего вы хотите достичь. Объяснение приведено в справочной документации Spring .

0
ответ дан Uwe Plonus 28 August 2018 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: