Как обновить параметр заголовка и отправить его в контроллер с помощью AOP при загрузке Spring / Spring

Попробуйте построить цикл и подсчитать ваши строки. Что-то связать это

rl = []
with opne("your_file") as fd:
  cnt = 25 #let's start outside required line number after text
  for l in fd.readlines():
     cnt += 1
     if "text" in l: # "text" in your line
       cnt = 0       # reset counter
     elif cnt in [3,12,13,14,15]: # if counter is one of lines you want
       rl.append(l)               # record them
print rl
0
задан Thiagarajan Ramanathan 19 January 2019 в 14:18
поделиться

2 ответа

Ваша проблема заключается не в аннотации @Before, а в ошибочной установке атрибута в HttpServletRequest вместо заголовка. Атрибут! = Заголовок. Поэтому, конечно, этот параметр будет нулевым в вашем контроллере.

Заголовки в HttpServletRequest доступны только для чтения. Вам нужно будет обернуть запрос в HttpServletRequestWrapper и выполнить все виды работ для управления исходными и вашими собственными заголовками. Существует множество примеров, в том числе полный: https://wilddiary.com/adding-custom-headers-java-httpservletrequest/

В нем представлен MutableHttpServletRequest, расширяющий HttpServletRequestWrapper. Вы будете сохранять состояние ваших пользовательских заголовков и просто их с оригинальными. Вам придется переопределить getHeader и getHeaderNames!

Ваш код @Before будет выглядеть примерно так:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
MutableHttpServletRequest wrappedRequest = new MutableHttpServletRequest(request);
request.putHeader("traceId", ServiceUtil.getTraceId());
return request;

Однако, чтобы получить немного функциональности (если вам не нужно делать это снова и снова). Для разового использования я бы просто использовал технику @Around.

Вся эта церемония добавит ценность карте!

0
ответ дан Robert Moskal 19 January 2019 в 14:18
поделиться

Я смог сделать это, используя @Around. Я считаю, что это невозможно сделать с помощью @Before.

  @Around("execution(* com.test.api.*.*(..)) && " + "args(traceId,..)")
  public Object setTraceId(ProceedingJoinPoint joinPoint, String traceId) throws Throwable
  {
    String newTraceId = ServiceUtil.getTraceId();
    Object[] obj = joinPoint.getArgs();
    obj[0] = newTraceId;
    return joinPoint.proceed(obj);
  }
0
ответ дан Thiagarajan Ramanathan 19 January 2019 в 14:18
поделиться
Другие вопросы по тегам:

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