Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 083110c

Browse files
committed
fix: reload router functions when a plugin adds endpoints
1 parent ea9d6fc commit 083110c

File tree

4 files changed

+70
-6
lines changed

4 files changed

+70
-6
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ client/.yarn/cache/*.zip
55
server/node-service/.yarn/cache/*.zip
66
.metadata/
77
.DS_Store
8+
application-dev.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.lowcoder.api.framework.configuration;
2+
3+
import org.lowcoder.api.framework.plugin.endpoint.ReloadableRouterFunctionMapping;
4+
import org.springframework.context.annotation.Configuration;
5+
import org.springframework.web.reactive.config.WebFluxConfigurationSupport;
6+
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping;
7+
8+
@Configuration
9+
public class CustomWebFluxConfigurationSupport extends WebFluxConfigurationSupport
10+
{
11+
@Override
12+
protected RouterFunctionMapping createRouterFunctionMapping()
13+
{
14+
return new ReloadableRouterFunctionMapping();
15+
}
16+
17+
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/plugin/endpoint/PluginEndpointHandlerImpl.java

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,32 @@
2121
import org.lowcoder.plugin.api.data.EndpointRequest;
2222
import org.lowcoder.plugin.api.data.EndpointResponse;
2323
import org.lowcoder.sdk.exception.BaseException;
24+
import org.springframework.context.ApplicationContext;
25+
import org.springframework.context.support.GenericApplicationContext;
2426
import org.springframework.core.ResolvableType;
2527
import org.springframework.http.ResponseCookie;
2628
import org.springframework.stereotype.Component;
2729
import org.springframework.web.reactive.function.server.RequestPredicate;
2830
import org.springframework.web.reactive.function.server.RouterFunction;
2931
import org.springframework.web.reactive.function.server.ServerResponse;
3032
import org.springframework.web.reactive.function.server.ServerResponse.BodyBuilder;
33+
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping;
3134

35+
import lombok.RequiredArgsConstructor;
3236
import lombok.extern.slf4j.Slf4j;
3337
import reactor.core.publisher.Mono;
3438

3539
@Slf4j
40+
@RequiredArgsConstructor
3641
@Component
3742
public class PluginEndpointHandlerImpl implements PluginEndpointHandler
3843
{
3944
private static final String PLUGINS_BASE_URL = "/plugins/";
4045
private List<RouterFunction<ServerResponse>> routes = new ArrayList<>();
41-
46+
47+
private final ApplicationContext applicationContext;
48+
private final RouterFunctionMapping routerFunctionMapping;
49+
4250
@Override
4351
public void registerEndpoints(String pluginUrlPrefix, List<PluginEndpoint> endpoints)
4452
{
@@ -57,7 +65,9 @@ public void registerEndpoints(String pluginUrlPrefix, List<PluginEndpoint> endpo
5765
registerEndpointHandler(urlPrefix, endpoint, handler);
5866
}
5967
}
60-
}
68+
}
69+
70+
((ReloadableRouterFunctionMapping)routerFunctionMapping).reloadFunctionMappings();
6171
}
6272
}
6373

@@ -74,8 +84,10 @@ private void registerEndpointHandler(String urlPrefix, PluginEndpoint endpoint,
7484
if (checkHandlerMethod(handler))
7585
{
7686

77-
EndpointExtension endpointMeta = handler.getAnnotation(EndpointExtension.class);
78-
routes.add(route(createRequestPredicate(urlPrefix, endpointMeta), req -> {
87+
EndpointExtension endpointMeta = handler.getAnnotation(EndpointExtension.class);
88+
String endpointName = endpoint.getClass().getSimpleName() + "_" + handler.getName();
89+
90+
RouterFunction<ServerResponse> routerFunction = route(createRequestPredicate(urlPrefix, endpointMeta), req -> {
7991
Mono<ServerResponse> result = null;
8092
try
8193
{
@@ -87,8 +99,10 @@ private void registerEndpointHandler(String urlPrefix, PluginEndpoint endpoint,
8799
throw new BaseException("Error running handler for [ " + endpointMeta.method() + ": " + endpointMeta.uri() + "] !");
88100
}
89101
return result;
90-
})
91-
);
102+
});
103+
routes.add(routerFunction);
104+
registerRouterFunctionMapping(endpointName, routerFunction);
105+
92106
log.info("Registered endpoint: {} -> {}: {}", endpoint.getClass().getSimpleName(), endpointMeta.method(), urlPrefix + endpointMeta.uri());
93107
}
94108
else
@@ -98,6 +112,18 @@ private void registerEndpointHandler(String urlPrefix, PluginEndpoint endpoint,
98112
}
99113
}
100114

115+
private void registerRouterFunctionMapping(String endpointName, RouterFunction<ServerResponse> routerFunction)
116+
{
117+
String beanName = "pluginEndpoint_" + endpointName + "_" + System.currentTimeMillis();
118+
119+
((GenericApplicationContext)applicationContext).registerBean(beanName, RouterFunction.class, () -> {
120+
return routerFunction;
121+
});
122+
123+
log.debug("Registering RouterFunction bean definition: {}", beanName);
124+
}
125+
126+
101127
private Mono<ServerResponse> createServerResponse(EndpointResponse pluginResponse)
102128
{
103129
/** Create response with given status **/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.lowcoder.api.framework.plugin.endpoint;
2+
3+
import org.springframework.web.reactive.function.server.RouterFunctions;
4+
import org.springframework.web.reactive.function.server.support.RouterFunctionMapping;
5+
6+
7+
public class ReloadableRouterFunctionMapping extends RouterFunctionMapping
8+
{
9+
/**
10+
* Rescan application context for RouterFunction beans
11+
*/
12+
public void reloadFunctionMappings()
13+
{
14+
initRouterFunctions();
15+
if (getRouterFunction() != null)
16+
{
17+
RouterFunctions.changeParser(getRouterFunction(), getPathPatternParser());
18+
}
19+
}
20+
}

0 commit comments

Comments
 (0)