spring boot 的 netty 上下文路径

Posted

技术标签:

【中文标题】spring boot 的 netty 上下文路径【英文标题】:netty context path for spring boot 【发布时间】:2019-08-22 13:44:10 【问题描述】:

我正在使用带有 webflux 的 spring boot 并从 starter web 中删除了嵌入式 tomcat 依赖项,我想为我的应用程序添加基本上下文路径,有什么办法吗?我需要这个,因为我在 kubernetes 集群后面有 ingrees 属性,并且重定向是基于上下文路径进行的。

    <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>

【问题讨论】:

你可以找到你的答案here @Mạnh Quyết Nguyễn,我在发布问题之前尝试了同样的方法,但没有运气:( 你能检查一下这个docs.spring.io/spring/docs/current/spring-framework-reference/… 【参考方案1】:

你不能同时使用 spring web 和 spring webflux 依赖。如果这样做,spring 将优先考虑 spring web 并且 webflux 过滤器将不会在启动时加载。

在启动期间,spring 会尝试为您创建正确的 ApplicationContext。正如这里所写的Spring boot Web Environment,如果 Spring MVC (web) 在类路径上,它将优先考虑这个上下文。

Spring Boot 应用程序要么是传统的 Web 应用程序,要么是 webflux 应用程序。不能两者兼有。

ContextPath 不是反应式编程中使用的东西,因此您必须过滤每个请求并重写每个请求的路径。

这应该可以,它是一个组件 webfilter,它拦截每个请求,然后添加您在 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 响应式应用程序加载时才有效。

【讨论】:

但我使用路由器功能而不是使用传统控制器创建了休息端点 阅读我写的。如果你的类路径上有 spring mvc,它会找到它并将你的应用程序加载为非 webflux-application。不管你写了什么代码都没有关系。 为什么需要spring web?

以上是关于spring boot 的 netty 上下文路径的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中修改端口和上下文路径

spring boot上下文路径写在哪

Spring Boot 向 Actuator 端点添加上下文路径

Spring Boot:注入自定义上下文路径

如何在 Spring Boot 应用程序中添加两个上下文路径

如何在 Spring Boot Tests 中设置 servlet 上下文路径?