Чтение заполнителей в аспекте micronaut

#java #micronaut

#java #micronaut

Вопрос:

Я хочу создать аспект в micronaut, чтобы иметь общий способ отправки события в очередь с информацией, которая передается некоторым методам, а также некоторой информацией из контекста, например, параметры метода, ответ метода, продолжительность, исключения, заголовки запросов (для методов api) и т.д. Однако я хочу определить в аннотации, какие данные следует добавить к событию. У меня есть рабочий пример с использованием spring boot и SpEL:

 @Event( <- This is the annotation to create the event
     @Detail(key = "salary", value = "#request.salary.toString()"), <- This is the SpEL
     @Detail(key = "ipAddress", value = "#HttpServletRequest.getHeader('x-forwarded-for').split(',')[0]"), <- This gets the client ipAddress from the context
     @Detail(key = "userAgent", value = "#HttpServletRequest.getHeader('user-agent')"") <- This gets the browser

)
public void MyMethod(RequestInformation request){
}
  

В приведенном выше примере событие создается только с 3 свойствами и отправляется в очередь в формате json

 {
 details:[
    "salary":"6000",
    "ipAddress":"180.30.115.62",
    "userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Safari/605.1.15"
 ]
}
  

Я знаю, что SpEL не поддерживается Micronaut, как указано в документации: Spring Expression Language (SpEL) - SpEL expressions are not supported, property placeholders are however

Я пытался читать о заполнителях свойств, но большинство примеров связаны с получением значений из файлов .yml.

Я хотел бы знать, есть ли способ сделать что-то подобное без создания моего собственного языка в micronaut. Кроме того, переход на spring boot невозможен.

Я буду благодарен за любую помощь, совет или понимание того, как выполнить эту задачу.

Комментарии:

1. «Я пытался читать о заполнителях свойств, но большинство примеров связаны с получением значений из файлов .yml». — Возможно, в примерах, которые вы просматриваете, используются значения из .yml файлов, но наш механизм заполнения свойств на самом деле не привязан к этому. Заполнители могут быть заполнены из источника конфигурации micronaut, включая .yml файлы, .properties файлы, переменные среды ОС, системные свойства JVM и т.д.

2. Спасибо @JeffScottBrown может быть, у вас есть пример того, как заполнители могут быть разрешены из системных свойств или только из одного объекта во время выполнения? Я был бы очень признателен.

3. "maybe you have an example on how placeholders can be resolved from system properties" — Код будет выглядеть точно так же, независимо от того, откуда берется значение. Например, аннотация с чем-то вроде @SomeAnnotation("${some.config.setting}") может быть инициализирована значением типа some.config.setting , которое определено в application.yml , приложение могло быть запущено с -Dsome.config.setting=someValue , могла быть названа переменная среды ОС SOME_CONFIG_SETTING и т.д.

4. Для меня это ясно, но, как я опубликовал в вопросе, мне нужно пойти немного дальше. Например @SomeAnnotation("${someMethodParameter.someValue}") для разрешения при выполнении аспекта. Например @Override public Object intercept(final MethodInvocationContext<Object, Object> context) { // here get placeholder resolved based on the parameters passed to the method. }

5. Я понимаю, что вы хотите сделать. Я рассматривал претензию, "I've tried reading about property placeholders but most of the examples are related to getting values from .yml files." чтобы уточнить, что заполнители могут быть заполнены значениями из множества мест, включая вашего собственного провайдера, если хотите, а не только .yml файлами.