joinPoint.getArgs. Но могу ли я наоборот установить аргумент? Например я хочу чтобы в аргументе не было явно написано HttpServletRequest httpServletRequest, ведь мы далеко не всегда его используем в методе. Но хотелось бы логировать каждый метод и получать его тип запросa. Может можно сделать такую аннотацию, которая инжектит неявно аргумент в метод
https://stackoverflow.com/a/4312242/6277184
java.lang.IllegalArgumentException: Expecting 0 arguments to proceed, but was passed 1 arguments https://pastebin.com/86FzfXrx
Кто-то переизобретает имплиситы из скалы, я смотрю
да не в скале имплиситы это ж фича языка, а тут хочется вытащить из @RequestMapping метода HttpServletRequest, не добавляя его в параметр каждого контроллерного метода)
Ну не добввляй если не юзаешь в чем трабл
так я делаю аспект, который читает из request'ов инфу и логирует
Чтобы читать что-то из аргументов метода, это что-то должно быть аргументом метода Если ты хочешь на лету менять то, какой метод на самом деле вызывается, ты абьюзишь аспекты там, где не надо
мб и так, пошел куда-то не туда видимо хД
Тебе какие-нибудь интерсепторы нужны, а не аспекты
ну да, я думал можно и так хД
тебе не надо делать параметры, тебе надо заинжектить HttpServletRequest в сам аспект.
@Component @Aspect @RequiredArgsConstructor public class AspectTest { private final HttpServletRequest httpServletRequest; @Before("@annotation(ru.TestAspect)") public void proceed() { System.out.println(httpServletRequest.getRequestURI()); } }
Тоесть по идее в анотированный метод будет заинжекчен реквест? Немного запутался
ты ставишь аннотацию своего аспекта над методом в RestController классе. описываешь аспект примерно как я описал выше, только со своими потребностями и инжектишь в класс обработки аспекта HttpServletRequest. Только не вздумай маркировать своей аннотацей методы, которые не имеют http конеткста
Да , как делать то я понимаю, не очень понимаю как этот реквест попадет в контроллер метод) выглядит будто он останется просто в аспект бине )
я видимо не понимаю чего ты хочешь 🙂 зачем тебе его в контроллер метод?
Чтобы залогировать инфу о нем)
очень абсратное требование конечно. Ты хочешь прямо в контроллере описывать логику логирования? Или ты для этого создал аспект и в нем логируешь?
Да для него) анноташка, которая будет логировать методы
Он создал аспект, где хочет логировать хттпреквест, но не хочет, чтобы в методах, с которыми будет работать этот аспект, этот иеквест был параметром
ты сменил аватар, я тебя не узнал 🙂 дак я же вроде проедложил нормальное решение?
Логика подсказывает, что реквестов много разных, а поле реквеста у тебя private final - каждый раз экземпляр создавать на новый реквест (и допрет ли спринг до такого?), получается?
да, спринг туда каждый раз подставляет конкретный текущий реквест
Последовательно?
Разве имплиситы - не сингтоны на этапе компиляции? H...Request впротивовес имеет жизненный цикл запроса
какой вызывается, тот и заинжектится. это же синхронный вызов
И новый экземпляр аспекта каждый раз?
Ты точно понимаешь, что из себя аспекты представляют?
/api/test api/test1 дернул две апи, маркированные аспект аннотацией - результат разный. Да, на каждый вызов свой инжект. К слову, когда мы ставим параметром хттпРеквест в методе контроллера, он туда тоже инжектится же? или не?
Ну да инжектится или как еще?)
Ну не знаю, что ты имеешь ввиду «представляет»?)
Я не знаю, как у спринга веб-составляющая под капотом устроена, но я бы сказал "просто подставляется как аргумент", DI тут вроде не при делах, по крайней мере, не обязан участвовать.
Объект реквеста можно инжектить как бин
Объект реквеста это бин в request scope, инжектится прокси, внутри будет текущий запрос из контекста
Обсуждают сегодня