Spring-Boot WireMock Server - Ошибка запроса не найдена - PullRequest
0 голосов
/ 11 октября 2019

Мы запускаем WireMock в Spring-boot со встроенным Tomcat 9, я могу заблокировать запрос с помощью WM, если запрос / ответ на заглушку доступны в каталоге mappings / __ files соответственно. Проблема заключается в том, что при попытке запросить список доступных заглушек с помощью http://localhost:8080/__admin/mappings мы получаем следующую ошибку:

ERROR 19332 --- [ultThreadPool-1] WireMock                                 : 
                                               Request was not matched
                                               =======================

-----------------------------------------------------------------------------------------------------------------------
| Closest stub                                             | Request                                                  |
-----------------------------------------------------------------------------------------------------------------------
                                                           |
GET                                                        | GET
/some/thing                                                | /__admin/mappings                                   <<<<< URL does not match
                                                           |
                                                           |
-----------------------------------------------------------------------------------------------------------------------

Мой начальный класс выглядит следующим образом:

  @SpringBootApplication (exclude = {DispatcherServletAutoConfiguration.class})    
  public class Starter extends SpringBootServletInitializer {       
   @Override    
   protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {    
      return configureApp(builder);    
   }  
       public static void main(String[] args) {  
      SpringApplication.run(Starter.class, args);    
   }       
   private static SpringApplicationBuilder configureApp(SpringApplicationBuilder builder) {    
      return builder.sources(Starter.class);    
   }      
}

WireMockConfig путем расширенияКласс ResourceConfig, как показано ниже

@Configuration
@ComponentScan(basePackages = {"com.github.tomakehurst.*"})
public class WireMockResourceConfig extends ResourceConfig  {

    @Bean
    public WireMockHandlerDispatchingServlet dispatcherServlet() {
        return new WireMockHandlerDispatchingServlet();
    }

    @Bean
    public ServletListenerRegistrationBean<ServletContextListener> listenerRegistrationBean() {

        ServletListenerRegistrationBean<ServletContextListener> bean = new ServletListenerRegistrationBean<>();
        bean.setListener(new WireMockWebContextListener());
        return bean;
    }

    @Bean
    public ServletContextInitializer fileSourceRoot() {

        return (ServletContext servletContext) -> {
            servletContext.setInitParameter("WireMockFileSourceRoot",
                    "/WEB-INF/wiremock");
        };
    }

    @Bean
    public ServletRegistrationBean<Servlet> dispatcherAdminServletRegistrationBean() {

        ServletRegistrationBean<Servlet> registration = new ServletRegistrationBean<>(dispatcherServlet());

        Map<String, String> params = new HashMap<String, String>();
        params.put("RequestHandlerClass", StubRequestHandler.class.getName());

        registration.setInitParameters(params);

        List<String> urlMappings = Arrays.asList("/*");
        registration.setUrlMappings(urlMappings);

        return registration;
    }    

    @Bean
    public ServletRegistrationBean<Servlet> dispatcherServletRegistrationBean() {

        ServletRegistrationBean<Servlet> registration = new ServletRegistrationBean<>(dispatcherServlet());

        Map<String, String> params = new HashMap<String, String>();
        params.put("RequestHandlerClass", AdminRequestHandler.class.getName());

        registration.setInitParameters(params);

        List<String> urlMappings = Arrays.asList("/__admin/*");
        registration.setUrlMappings(urlMappings);

        return registration;
    }
}

Я мог видеть, что Spring-boot имеет неоднозначность при выборе класса Handler во время инициализации и выбирает первый доступный ServletRegistrationBean в нашем случае тот, который указываетк root / * path и пытается сопоставить / admin / mappings с этим URL. Мой вопрос заключается в том, как заставить Spring-Boot регистрировать два класса обработчиков на основе пути URL. Этот тип конфигурации может быть обработан с использованием web.xml в обычном Spring, но я сталкиваюсь с трудностями в том, чтобы заставить Spring-boot работать таким образом.

...