Сохраняйте swagger-ui.html в спа-приложении spring-boot

У меня есть приложение с весенней загрузкой, в котором я перенаправляю все ресурсы на 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м в памяти.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
314
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо этого вы можете использовать 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("/"); }

Ссылка

Не думайте, что сопоставление запросов работает с регулярным выражением:/

randomname 15.03.2019 23:09

да, вы можете найти много ссылок на SO здесь. Пример 1.

Amith Kumar 15.03.2019 23:11
@RequestMapping(value = "^\/[^(api|swagger)].*") не работает, хотя регулярное выражение правильное.
randomname 15.03.2019 23:25

Ваше регулярное выражение неверно, я обновил ответ предложенным регулярным выражением и ссылкой из весеннего документа для получения более подробной информации и обучения.

Amith Kumar 16.03.2019 00:51

Мое предоставленное решение разрешило ваш запрос? Удалось ли вам добиться желаемого результата? См. Что мне делать, когда кто-то отвечает на мой вопрос?. Как спрашивающий, у вас есть особая привилегия: вы можете принять ответ, который, по вашему мнению, является лучшим решением вашей проблемы.

Amith Kumar 20.03.2019 01:32

Другие вопросы по теме