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启动时从数据库加载路由,但启动时出现异常
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;有人能帮我解决这个问题吗?我的议程是在启动时动态地将路由从数据库加载到spring网关中。
发布于 2020-01-31 18:48:34
一旦我提供了构造函数,这个问题就解决了:
@Autowired
public RefreshableRoutesLocator(@NonNull final RouteLocatorBuilder builder,
@NonNull final GatewayRoutesRefresher gatewayRoutesRefresher) {
this.builder = builder;
this.gatewayRoutesRefresher = gatewayRoutesRefresher;
clearRoutes();
}https://stackoverflow.com/questions/60001814
复制相似问题