我已经创建了一个spring引导应用程序(2.6.4),我想使用p4fj集成一些插件。我以前在非spring引导应用程序中使用过p4fj,但是我看到现在它有了p4fj-spring来帮助这个过程。
其思想不仅是集成插件方法,而且还要检查如何集成一些端点。为此目的,我正在跟踪官方教程。这里的要点是,为了包括插件端点(基于@RestController,而不是反应性端点),建议:
private void registerMvcEndpoints(PluginManager pm) {
pm.getExtensions(PluginInterface.class).stream()
.flatMap(g -> g.mvcControllers().stream())
.forEach(r -> ((ConfigurableBeanFactory) beanFactory)
.registerSingleton(r.getClass().getName(), r));
applicationContext
.getBeansOfType(RequestMappingHandlerMapping.class)
.forEach((k, v) -> v.afterPropertiesSet());
}该方法的第一部分是以bean的形式从插件中获取和注册所需的类,以便稍后将第二部分注册为端点。为此,它使用了一个RequestMappingHandlerMapping.class。如果我们遵循本教程中的示例,它对于一个没有自己端点的应用程序是很好的,它只是注册来自外部插件的端点。
我面临的问题是,当我试图混合一个已经有一些端点(由@RestController定义)的应用程序时,我想从一个或多个插件中添加一些额外的端点。运行前面的代码时,我会收到一个错误,它告诉我应用程序的端点不能注册为已经存在的。
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: Ambiguous handler methods mapped for '/health-check': {public void my.package.webservice.Info.healthCheck(javax.servlet.http.HttpServletRequest), public void my.package.webservice.Info.healthCheck(javax.servlet.http.HttpServletRequest)}似乎,当我们试图包含来自插件的所有端点时,它也同样包含了所有的应用程序端点,因此它面临着URL和方法对任何端点的唯一性的限制。我已经调试过了,事实上,RequestMappingHandlerMapping已经在spring (以及插件)注册了来自应用程序端点的信息。
我已经尝试创建一个定制的RequestMappingHandlerMapping,但这只是增加了更多的重复。我还试图从前面显示的registerMvcEndpoints方法中筛选出应用程序端点(即包或url),但我对它们并不满意,因为我们不是一个接一个地注册,而是在afterPropertiesSet()中一起注册。
那么问题是..。如何避免已由标准的spring初始化进程注册的端点的寄存器?或者,还有其他方法来注册插件端点吗?
发布于 2022-04-27 03:41:51
如果您想在Spring上使用pf4j,那么sbp是一个很好的开始;)
https://stackoverflow.com/questions/71683435
复制相似问题