Как я могу регистрировать запросы на неизвестные конечные точки URL в Spring Boot? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть приложение Spring Boot, которое использует SpringBootServletInitializer.
В моем Controller у меня есть несколько конечных точек, которые различаются в зависимости от параметра, включенного в URL, например:

@RequestMapping(value = "myEndpoint", method = RequestMethod.GET, params = { "Id", "name", "petType" })
public void get(@RequestParam String id, @RequestParam String name,  @RequestParam String petType){
   //do stuff
} 

@RequestMapping(value = "myEndpoint", method = RequestMethod.GET, params = { "Id", "name"})
public void get(@RequestParam String id, @RequestParam String name){
   //do stuff
} 

Наличие параметров в теге @RequestMapping означает, что если пропущены параметры, клиенту, отправившему запрос, сообщается ответ об ошибке; однако на стороне сервера ничего не регистрируется.
Я хочу реализовать ведение журналов, поэтому, если делается запрос к /myEndpoint, в котором отсутствуют параметры, он отображается в журналах сервера. Что-то вроде URL и параметров исходного запроса. С этой целью я наткнулся на этим весенним уроком , который я пытался реализовать. Однако я столкнулся с проблемой, когда учебник реализует CustomWebAppInitializer, который расширяет WebApplicationInitalizer, мое приложение уже расширяет SpringBootServletInitializer.
Когда я пытаюсь реализовать оба, я получаю сообщение об ошибке, поскольку SpringBoot уже имеет корневой контекст, который уже был инициализирован SpringBootServletInitializer.
Когда я пытаюсь переопределить метод onStartup() в SpringBootServletInitializer, вместо этого он работает, но мое приложение не инициализируется должным образом и не может быть доступно из браузера.

Я попытался переопределить метод и добавить фильтр перед вызовом super и передачей ServletContext обратно по цепочке, но это тоже не работает.

servletContext.addFilter("CommonsRequestLoggingFilter",
            CommonsRequestLoggingFilter.class)
    .addMappingForServletNames(null, false, "myApp");
    super.onStartup(servletContext);

Я немного растерялся. Что я здесь не так делаю? (наверное все).

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Попробуйте добавить Custom HandlerInterceptor в ваш WebMvcConfigurer для целей регистрации.

@Configuration
public class HttpRequestInterceptorConfigurer implements WebMvcConfigurer {

    private static Logger LOG = Logger.getLogger(HttpRequestInterceptorConfigurer.class);

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {

            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                LOG.info("URI : " +request.getRequestURI() +" - QueryStr : " +request.getQueryString());
                return true;
            }

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {              
            }

        });

    }

}
0 голосов
/ 25 апреля 2018

Поскольку Spring Boot уже устанавливает контекст, вам не нужно использовать CustomWebAppInitializer. Вам нужно только объявить bean-компонент для CommonsRequestLoggingFilter в классе Configuration. Если поведение не удовлетворяет вашим потребностям, вы можете реализовать javax.servlet.Filter и объявить компонент для вашей реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...