如何在运行时将Controller加载到SpringMVC

时间:2017-07-21 09:29:41

标签: java spring-mvc

我遇到了如何在运行时将控制器加载到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。 我希望有人会帮助我。感谢您的阅读

0 个答案:

没有答案