У меня есть DispatcherServlet, у которого есть сопоставление URL /api1
и, следовательно, контроллер с отображением @GetMapping("/resource1")
для метода контроллера.Поэтому в основном у меня есть действительный URL /api1/resource1
, который должен обрабатываться упомянутым контроллером.
Кроме того, в настройку включен Spring Security Filter, который сопоставляет запросы /*
, так как он защищает другие URL, не обработанные Spring (но джерси например).API, защищенный Spring Security Filter, настроен следующим образом:
protected void configure(HttpSecurity http) throws Exception {
//@formatter:off
http.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.requestMatchers()
.antMatchers("/api1/**")
.and()
.authorizeRequests()
.antMatchers("/**")
.authenticated()
. Для тестирования я использую поддержку MockMvc * для настройки виртуальной веб-среды, включая настройку безопасности Spring
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build()
Я хочучтобы проверить, применяются ли проверки безопасности и вызывается ли метод контроллера при успешных проверках безопасности.
when:
def result = mvc.perform(
get('/api1/resource1')
.header(HttpHeaders.AUTHORIZATION, "Bearer " + apiToken))
then:
result.andExpect(status().isOk())
Приведенный выше код основан на платформе Spock с компонентом MockMvc.Все проверки безопасности проходят, поэтому настройка безопасности Spring завершена, но, наконец, контроллер должен быть вызван, но происходит сбой со статусом 404, т. Е. Ресурс - это метод сопоставленного контроллера - не найден.
IЯ уверен, что это не удастся, потому что макет установки не включает отображение сервлета диспетчера /api
.Чтобы подтвердить это предположение, я могу изменить отображение метода контроллера на @GetMapping("/api1/resource1")
, и в результате теста будет получен HTTP OK (200).
Итак, мой вопрос, можно ли настроить вид префикса URLв настройке MockMvc?Есть одно ограничение: база кода не использует Spring Boot (и не может некоторое время в будущем)!
Редактировать : я добавил следующее в свой тест, чтобы все запросыустановить servletPath.
static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
new MockHttpServletRequestBuilder(HttpMethod.GET, urlTemplate, uriVars)
.servletPath('/api1')
}