在TeamCity中从AbstractController中获取Spring RestController

时间:2019-03-01 19:57:44

标签: java spring rest teamcity spring-restcontroller

TeamCity插件API允许通过扩展控制器BaseController来添加控制器,该控制器是Spring AbstractController的薄包装。

当我扩展BaseController时,我可以用通常的Spring方式将bean注入到构造函数中。这是由像标准spring这样的bean定义文件管理的。

要提供控制器,我必须扩展BaseController,覆盖 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response),然后将控制器添加到bean定义中。我将URL路由注册为构造函数初始化的一部分。

这是Controller可用的所有扩展点。

我希望能够编写一个小型框架,该框架允许我使用@RestController@RequestMapping等来注释我的类。

我想我需要做的是:

  • 连接注释处理器以查找我的控制器及其方法。
  • 构建某种映射器,将@RequestMapping带注释的方法映射到路由
  • 连接一些内容处理程序,例如JSON和XML的序列化/反序列化
  • 将传入的请求分配到我的handleRequest方法中的适当方法

以上大部分内容已在Spring和Jersey编写,我想知道从哪里开始进行研究。

哪些类提供上述功能? 我已经尝试了一些尝试实例化MVC的方法,但是当ApplicationContext不可用时,它似乎崩溃了。

1 个答案:

答案 0 :(得分:0)

不是TeamCity用户。但是我会给我两分钱,希望能得到最好的。
既然您可以注册Spring Bean,为什么不尝试ClassPathBeanDefinitionScanner

如果您可以某种方式访问​​Spring生命周期挂钩,初始化挂钩,或者能够注册Configuration类,则可以创建类型Bean的{​​{1}}。我会给您一个Java示例,但是您应该能够将其快速转换为XML。

BeanFactoryPostProcessor

@Bean public BeanFactoryPostProcessor beanFactoryPostProcessor(final ApplicationContext applicationContext) { return new BeanFactoryPostProcessor() { @Override public void postProcessBeanFactory(final ConfigurableListableBeanFactory beanFactory) throws BeansException { if (beanFactory instanceof BeanDefinitionRegistry) { try { final BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; final ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry); scanner.setResourceLoader(applicationContext); scanner.scan("your.base.package"); } catch (final Exception e) { // Handle } } } }; } 将注册所有带有Spring构造型注释的类。
您还可以使类直接实现ClassPathBeanDefinitionScanner接口。