Используйте функциональность @RequestMapping (сопоставление метода URL с Java) без HTTP-запроса / сервлета

Я пытаюсь создать простой PoC для замены приложения, которое в настоящее время использует файлы JAR, загруженные в основное веб-приложение Java (Spring MVC 4.2), для объявления дополнительных контроллеров при запуске. Это выглядит примерно так:

Client <--HTTP--> Gateway+app (Spring MVC + order.jar)

Exposed endpoints:
/ping via controller in core Spring app
/orderApp/doSomething via controller in order.jar

В идеале мне бы хотелось, чтобы каждый JAR-файл был автономным приложением Spring Boot, обмениваясь данными с помощью Spring Integration 4.2 (через AMQP), и мой HTTP-шлюз обращался к внешнему миру. Маленькая схема:

Client <--HTTP--> Gateway (Spring MVC) <--AMQP--> Standalone orderApp (Spring Boot)

Exposed endpoints:
/ping via controller in core Spring MVC app
/{appName}/** via controller in core Spring MVC app

У меня есть логика в контроллере в приложении MVC, который находит, какой обмен AMQP должен получать сообщения на основе appNameЯ сериализирую HTTP-запрос с использованием шлюза, отправляю его в соответствующее приложение, могу обработать его, отправляю ответ основному приложению Spring, которое пересылает ответ клиенту. Здесь нет проблем.

Тем не менее, я хотел бы, если это возможно, использовать удобные @RequestMapping аннотация, которую я сейчас использую в моих JAR-файлах. Эти JAR в основном содержат дополнительные контроллеры, выставляющие конечные точки под данным корнем.

Вопрос

Как вручную вызвать @RequestMapping логика, учитывая URL, тело запроса и заголовки в качестве ввода? Например, скажем, у меня есть такая реализация:

@RequestMapping("projects/{projectId}")
public Project projectById(@PathVariable final String projectId) {

    (...)
    return project;
}

Есть ли способ, что из кода пользовательского сервиса где-нибудь в моем автономном приложении я мог бы сделать вызов, такой как handler.getResponse("projects/123abc", requestBody, requestHeaders), что бы автоматически найти какой метод вызывать с учетом входных параметров /URL?

Я не хочу, чтобы все функции от @RequestMapping (нет прямого доступа к HttpServletRequest/HttpServletResponse например конечно). То, что я хочу сделать, немного похоже на макет HttpServletRequest, но без всяких затрат сервлетов и всего остального. И это должен быть "производственный" код, а не то, что используется в тестах.

В противном случае я ничего не имею против использования чего-то другого, кроме @RequestMappingпри условии, что я могу добиться такого же вида отображения между URI и методами Java, автоматически получая параметры, извлеченные из URI. Пользовательский маршрутизатор Spring Integration? Я знаю, что у СИ есть некоторые request-mapping поддержка, но только через HTTP из того, что я видел.

1 ответ

Не совсем понятно, что вы ищете; вы уже сказали, что маршрутизируете в фоновое приложение, определив ключ обмена / маршрутизации в контроллере.

Если вы имеете в виду, что каждая внутренняя служба должна обрабатывать несколько типов запросов и нуждается в дальнейшей маршрутизации, то да, вероятно, лучшим решением является маршрутизатор.

Вопрос в том, как вы собираетесь передавать эту информацию (маршрут) на серверную часть - предположительно в свойстве / заголовке сообщения.

Вы правы в том, что SI использует внутреннее сопоставление запросов только в конечных точках HTTP, но ничто не мешает вам написать маршрутизатор на основе аннотаций, использующий те же аннотации.

Другие вопросы по тегам