我遇到了如何在运行时将控制器加载到SpringMVC的问题。我的项目是使用SpringMVC框架并结合Dynamic Module OSGi模型。目前,我使用Gemini Blueprint实现OSGi并分为2个捆绑。
让我们假设,两个包是:
- Bundle A:Web应用程序使用Spring MVC。它首先部署
- Bundle B:bundle只包含@Controller类。它表示稍后将升级的功能。
此时的一个问题是如何将B组中的类控制器加载到运行时的A组。所以我搜索如何以编程方式添加控制器并找出解决方案。见HERE。之后,在bundle A,我将该对象注册到OSGi Container,bundle B可以引用并调用寄存器控制器方法。
以下代码是这样的。首先,在捆绑A:
@Component
public class RegistryController implements BeanDefinitionRegistryPostProcessor {
private BeanDefinitionRegistry registry;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
this.registry = registry;
}
public void registryController(Class<?> clazz, String beanName) {
BeanDefinition bean = new RootBeanDefinition(clazz);
registry.registerBeanDefinition(beanName, bean);
}
}
<osgi:service interface="com.test.bundleA.config.RegistryController " ref="RegistryController" />
然后,在B组中,我将从bundle A引用RegistryController对象并调用registryController()方法。
<osgi:reference id="registryController"
interface="com.test.bundleA.config.RegistryController">
<osgi:reference-listener ref="registryControllerListener"
bind-method="bind" />
</osgi:reference>
@Component
public class RegistryControllerListener {
public void bind(RegistryController registry) {
System.out.println("Binding: " + registry);
registry.registryController(TestController.class, "testController");
}
}
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping
public String test() {
return "TEST";
}
}
完成之后,我开始将捆绑包部署到OSGi Container:首先捆绑A,然后捆绑B.根据我的观察,TestController bean注册到捆绑A,但是当我在浏览器中使用url&#34; / test&#进行测试时34;,&#34;未找到页面&#34;消息显示。我尝试刷新Web应用程序上下文,但结果仍然没有改变。刷新Web应用程序上下文仅重新加载文件.xml中定义的bean。 我希望有人会帮助我。感谢您的阅读