У меня есть приложение с весенней загрузкой, в котором я перенаправляю все ресурсы на index.html, потому что мой интерфейс — это SPA.
Как бы то ни было, я хочу сохранить вызов localhost:8080/swagger-ui.html таким же и перезаписать все остальные.
Кажется, что addResourceHandler не работает с регулярными выражениями. Любые идеи о том, как решить эту проблему?
import java.io.IOException;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**/*") //^/[^(api|swagger)].*
.addResourceLocations("classpath:/public/")
.resourceChain(true)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
Resource requestedResource = location.createRelative(resourcePath);
return requestedResource.exists() && requestedResource.isReadable() ? requestedResource : new ClassPathResource("/public/index.html");
}
})
;
}
}
PS: я использую Spring Fox с swaggerм в памяти.




Вместо этого вы можете использовать Spring Controller с аннотацией @RequestMapping, которая использует путь регулярного выражения.
//redirects all paths except one containing api or swagger references.
@RequestMapping(value = ""/**/{path:^(?!swagger|api).*}"")
public void redirect(HttpServletResponse response) throws IOException { response.sendRedirect("/"); }
да, вы можете найти много ссылок на SO здесь. Пример 1.
@RequestMapping(value = "^\/[^(api|swagger)].*") не работает, хотя регулярное выражение правильное.
Ваше регулярное выражение неверно, я обновил ответ предложенным регулярным выражением и ссылкой из весеннего документа для получения более подробной информации и обучения.
Мое предоставленное решение разрешило ваш запрос? Удалось ли вам добиться желаемого результата? См. Что мне делать, когда кто-то отвечает на мой вопрос?. Как спрашивающий, у вас есть особая привилегия: вы можете принять ответ, который, по вашему мнению, является лучшим решением вашей проблемы.
Не думайте, что сопоставление запросов работает с регулярным выражением:/