Внедрение объектов на запрос в Spring RestController с использованием HandlerInterceptorAdapter

В настоящее время у меня есть веб-служба REST, использующая Spring RestController. Я реализовал HandlerInterceptorAdapter, где хочу установить некоторые пользовательские данные.

Код такой:

@Component
public class UserContextInterceptor extends HandlerInterceptorAdapter {

  @Autowired
  private UserContext userContext;

  @Override
  public boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //set userContext here
    userContext.setLoginId("loginId");

    return true;
  }
}

Вот RestController:

@RestController
public class MyController {

  @Autowired
  private MyService myService;

  @GetMapping
  public Response processRequest(Request request) {
    return myService.processRequest(request);
  }
}

Вот Служба. Это просто вызывается контроллером:

@Service
public class MyService {

  @Autowired
  private UserContext userContext;

  public Response processRequest(Request request) {
    //process request using userContext
    if (userContext.getLoginId() == null)
      throw new InvalidloginException("No login id!");
    //do something else
    return new Response();
  }
}

UserContext - это просто POJO, содержащий пользовательские поля.

В моей реализации UserContext, как мне кажется, не является потокобезопасным. Объект UserContext будет переопределяться каждый раз, когда приходит запрос. Я хотел бы знать, как правильно автоматизировать / аннотировать его таким образом, чтобы я хотел, чтобы новый UserContext каждый раз, когда приходит запрос. И этот UserContext будет правильно вставлен в MyService. Это означает, что все вызовы в MyService.processRequest всегда будут иметь другой UserContext, введенный в него.

Одно из решений, о котором я думал, заключалось в том, чтобы просто передать объект UserContext в метод MyService.processRequest (). Мне просто интересно, можно ли решить эту проблему с помощью Spring autowire или других аннотаций.

Любые идеи?

Спасибо!

Вы можете использовать bean-компонент с ограниченным объемом запроса вместо одноэлементного bean-компонента, как описано в baeldung.com/spring-bean-scopes

Kishore Kirdat 11.10.2018 08:38

@KishoreKirdat Вы правы. Запросить bean-компонент для решения моей проблемы. Я использовал этот stackoverflow.com/a/36318183/2682526 для решения

racumin 11.10.2018 11:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
565
0

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