首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring网关RouteLocator空指针异常

Spring网关RouteLocator空指针异常
EN

Stack Overflow用户
提问于 2020-01-31 18:10:00
回答 1查看 511关注 0票数 0
代码语言:javascript
复制
import java.net.URISyntaxException;

import javax.validation.constraints.NotNull;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Component
public class RefreshableRoutesLocator implements RouteLocator {

    private RouteLocatorBuilder builder;
    private RouteLocatorBuilder.Builder routesBuilder;
    private Flux<Route> route;

    @Autowired
    GatewayRoutesRefresher gatewayRoutesRefresher;

    @Autowired
    private RouteDefinitionWriter routeDefinitionWriter;

    public void RefreshRouteLocator(RouteLocatorBuilder builder) {
        this.builder = builder;
        clearRoutes();
    }

    public void clearRoutes() {
        routesBuilder = builder.routes();
    }

    public RefreshableRoutesLocator addRoute(@NotNull final String id, @NotNull final String path,
            @NotNull final URI uri) throws URISyntaxException {
        System.out.println("-----------");
        if (StringUtils.isEmpty(uri.getScheme())) {
            throw new URISyntaxException("Missing scheme in URI: {}", uri.toString());
        }
        routesBuilder.route(id, fn -> fn.path(path + "/**").uri(uri));
        return this;
    }

    public RefreshableRoutesLocator addRoute(@NotNull RouteDefinition definition) {
        routeDefinitionWriter.save(Mono.just(definition)).subscribe();
        return this;
    }

    public void buildRoutes() {
        this.route = routesBuilder.build().getRoutes();
        gatewayRoutesRefresher.refreshRoutes();
    }

    @Override
    public Flux<Route> getRoutes() {
        return route;
    }
} 

我使用RefreshableRoutesLocator在spring启动时从数据库加载路由,但启动时出现异常

代码语言:javascript
复制
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.NullPointerException: The mapper returned a null Publisher
Caused by: java.lang.NullPointerException: The mapper returned a null Publisher

在检查时,我发现路由在开始时是空的:

代码语言:javascript
复制
private Flux<Route> route;

有人能帮我解决这个问题吗?我的议程是在启动时动态地将路由从数据库加载到spring网关中。

EN

回答 1

Stack Overflow用户

发布于 2020-01-31 18:48:34

一旦我提供了构造函数,这个问题就解决了:

代码语言:javascript
复制
@Autowired
    public RefreshableRoutesLocator(@NonNull final RouteLocatorBuilder builder,
            @NonNull final GatewayRoutesRefresher gatewayRoutesRefresher) {
        this.builder = builder;
        this.gatewayRoutesRefresher = gatewayRoutesRefresher;
        clearRoutes();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60001814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档