Spring Gateway RouteLocator null Указатель исключение - PullRequest
0 голосов
/ 31 января 2020
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 для загрузки маршрутов при весеннем запуске из базы данных, но при запуске я получаю исключение

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.NullPointerException: The mapper returned a null Publisher
Caused by: java.lang.NullPointerException: The mapper returned a null Publisher

При проверке я обнаружил, что маршрут при запуске пуст:

private Flux<Route> route;

Может ли кто-нибудь помочь мне исправить это, Моя повестка дня - динамически загружать маршруты из базы данных в весенний шлюз при запуске.

1 Ответ

0 голосов
/ 31 января 2020

Это было решено, как только я предоставил конструктор:

@Autowired
    public RefreshableRoutesLocator(@NonNull final RouteLocatorBuilder builder,
            @NonNull final GatewayRoutesRefresher gatewayRoutesRefresher) {
        this.builder = builder;
        this.gatewayRoutesRefresher = gatewayRoutesRefresher;
        clearRoutes();
    }
...