АОП со Springboot, java.io.PrintStream

Построил простое приложение Springboot с некоторыми аспектами, проверяющими архитектуру и так далее.

я пытаюсь перехватить каждый вызов System.out.println(), чтобы предупредить об использовании, поэтому я нашел это до сих пор:

System.out.println() использует PrintStream, поэтому я попробовал это:

@Aspect
@Component
public class CleanCodeAspect {

    @Before("call(void java.io.PrintStream.println(String))")
    public void beforePrintlnCall() {
        System.out.println("About to make call to print Hello World");
   }

}

Но безуспешно. Журнал говорит

The pointcutexpression call(void java.io.PrintStream.println(String)) contains unsupported pointcut primitive 'call'

Аналогичный аспект работает, но с выполнением вместо вызова:

@Aspect
@Component
public class BooleanServiceMonitor {

    @Before("execution(* de.fhb..*Service.*(java.lang.Boolean))")
        public void logServiceAccess() {
            System.out.println("You used a method with only one boolean parameter. "
                    + "Refactor it into 2 methods with True, False at the end.");
        }

    }

1 ответ

Решение

Spring использует прокси для применения AOP, Spring может использовать только прокси пружины на основе бобов. Реализация класса PrintStream вообще не настроенные бобы весны. Рядом с этим Spring AOP поддерживает только подмножество синтаксиса AspectJ (как указано в сообщении), которое он поддерживает (среди прочих) execution и специальный bean. срезы в

Если вы хотите использовать больше функций (т.е. call сокращение) вам придется использовать полнофункциональный AspectJ с ткачеством загрузки или компиляции.

Другие вопросы по тегам