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