Spring `RestController` из` AbstractController` в TeamCity - PullRequest
0 голосов
/ 01 марта 2019

API плагинов TeamCity позволяет добавлять контроллеры, расширяя их BaseController, который представляет собой тонкую оболочку вокруг Spring * AbstractController.

Когда я расширяю BaseController, я могу вставлять бины в конструктор обычным Springманера.Это управляется файлом определения компонентов, таким как стандартная пружина.

Чтобы предоставить контроллер, я должен расширить BaseController, переопределить public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) и добавить контроллер в определение компонентов.Я регистрирую URL-маршрут как часть инициализации конструктора.

Это касается всех точек расширения, доступных мне для Controller.

Я надеялся, что смогу написать небольшой каркас, который позволил бы мнеаннотируйте мои классы с помощью @RestController и @RequestMapping и т. д.

Я думаю, что мне нужно сделать следующее:

  • Подключить процессор аннотаций, чтобы найти мои контроллеры и их методы..
  • Построить какой-то тип сопоставления, который сопоставляет @RequestMapping аннотированные методы с маршрутами
  • Подключите некоторые обработчики контента, например, сериализацию / десериализацию для JSON и XML
  • Отправка входящих запросовк соответствующему методу внутри моего метода handleRequest

Большая часть вышеперечисленного уже написана в Спринге и Джерси, и мне интересно, где я начну это исследовать.

Какие классы предоставляютвыше функциональности?Я попробовал несколько вещей, чтобы попытаться создать экземпляр MVC, но он, кажется, ломается, когда ApplicationContext недоступен.

1 Ответ

0 голосов
/ 01 марта 2019

Не TeamCity пользователь.Однако я дам два своих цента, надеясь на лучшее.
Если вы можете зарегистрироваться Spring Bean, почему бы не попробовать ClassPathBeanDefinitionScanner?

Если у вас есть доступ к как-тоХук жизненного цикла Spring, инициализация или, если вы можете зарегистрировать класс Configuration, вы можете создать Bean типа BeanFactoryPostProcessor.Я приведу пример Java, но вы сможете довольно быстро его перевести в XML.

@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
                }
            }
        }
    };
}

ClassPathBeanDefinitionScanner зарегистрирует все классы с аннотациями стереотипов Spring.
Вы также можетезаставить класс реализовать интерфейс BeanFactoryPostProcessor напрямую.

...