контекстный путь netty для весенней загрузки - PullRequest
2 голосов
/ 01 апреля 2019

Я использую весеннюю загрузку с webflux и удалил встроенную зависимость tomcat из стартовой сети, я хотел добавить базовый путь к контексту для своего приложения, есть ли способ, которым я могу сделать ?? Мне это нужно, потому что у меня есть свойства ingrees за кластером kubernetes, а перенаправление выполняется на основе пути к контексту.

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
    <exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
    </exclusions>

1 Ответ

1 голос
/ 11 июня 2019

Нельзя использовать зависимости Spring Web и Spring Webflux одновременно. Если вы это сделаете, Spring установит приоритеты Spring Web, и фильтры Webflux не будут загружаться при запуске.

Во время запуска Spring пытается создать правильный ApplicationContext для вас. Как написано здесь Веб-среда загрузки Spring , если Spring MVC (web) находится в пути к классам, он установит приоритет этого контекста.

Приложение с весенней загрузкой - это либо традиционное веб-приложение, либо ИЛИ приложение webflux. Это не может быть и то и другое.

ContextPath - это не то, что используется в реактивном программировании, поэтому вы должны фильтровать каждый запрос и переписывать путь для каждого запроса.

Это должно сработать, это компонентный веб-фильтр, который перехватывает каждый запрос и затем добавляет контекстный путь, который вы определили в application.properties

@Component
public class ContextFilter implements WebFilter {

    private ServerProperties serverProperties;

    @Autowired
    public ContextFilter(ServerProperties serverProperties) {
        this.serverProperties = serverProperties;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        final String contextPath = serverProperties.getServlet().getContextPath();
        final ServerHttpRequest request = exchange.getRequest();
        if (!request.getURI().getPath().startsWith(contextPath)) {
            return chain.filter(
                    exchange.mutate()
                            .request(request.mutate()
                                            .contextPath(contextPath)
                                            .build())
                            .build());
        }
        return chain.filter(exchange);
    }
}

Но это будет работать, только если ваше приложение загружено как реактивное приложение Spring.

...