Мы запускаем 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 работать таким образом.