Как преобразовать javax.servlet.http.HttpServletRequest в org.springframework.http.HttpRequest или добавить HttpRequest в bean-компонент - PullRequest
0 голосов
/ 04 апреля 2019

В моем приложении мне нужно перехватить некоторый API. Моя rest api обрабатывается org.springframework.web.servlet.handler.HandlerInterceptorAdapter (HIA). Чтобы получить более гибкий контроль над restTemplate, я использую реализацию org.springframework.http.client.ClientHttpRequestInterceptor (CHRI). Оба в порядке и правильно. Но у меня есть проблема, потому что аналогичные функции должны управляться два раза, потому что CHRI использует org.springframework.http.HttpRequest, а HIA использует javax.servlet.http.HttpServletRequest.

Чтобы уменьшить дублирование и обходные пути, я хотел бы получить решение для любой из следующих проблем:

  • как конвертировать javax.servlet.http.HttpServletRequest в org.springframework.http.HttpRequest;
  • Существуют ли какие-либо инструменты для перехвата остальных вызовов с другим подходом к моему (я использовал HIA реализацию CustomInterceptor для настройки моей сети):

    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
    
      @Autowired
      private CustomInterceptor customInterceptor;
    
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor);
      }
    }
    
  • как внедрить HttpRequest в HIA реализацию?

    @Component
    @Slf4j
    public class CustomInterceptor extends HandlerInterceptorAdapter {
    
      // required injection!!!
      // TODO this code part doesn't work
      @Autowired
      private ObjectFactory<HttpRequest> httpRequest;
    
      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("preHandle");
        return super.preHandle(request, response, handler);
      }
    
      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle");
        super.postHandle(request, response, handler, modelAndView);
      }
    
      @Override
      public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion");
        super.afterCompletion(request, response, handler, ex);
      }
    
      @Override
      public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("afterConcurrentHandlingStarted");
        super.afterConcurrentHandlingStarted(request, response, handler);
      }
    }
    
...