在没有HTTP请求/ servlet的情况下使用@RequestMapping功能(Java方法映射的URL)

Nic*_*las 6 java spring spring-mvc spring-integration

我正在尝试构建一个简单的PoC来替换当前依赖于主Java(Spring MVC 4.2)Web应用程序中加载的JAR文件的应用程序,以在启动时声明其他控制器.它看起来非常像:

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

Exposed endpoints:
/ping via controller in core Spring app
/orderApp/doSomething via controller in order.jar
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望将每个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
Run Code Online (Sandbox Code Playgroud)

我在MVC应用程序的控制器中有逻辑,找到哪个AMQP交换机应该接收基于的消息appName,我使用网关串行化HTTP请求,将其发送到正确的应用程序,可以处理它,将回答发送回主要Spring应用程序将响应转发给客户端.这里没问题.

但是,我希望尽可能重用@RequestMapping我目前在JAR文件中使用的方便注释.这些JAR基本上包含额外的控制器,在给定的根下暴露端点.

@RequestMapping如果输入URL,请求正文和标题,如何手动触发逻辑?例如,假设我有一个类似的实现:

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

    (...)
    return project;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法从我的独立应用程序中的某个地方的自定义服务代码我可以做一个调用handler.getResponse("projects/123abc", requestBody, requestHeaders),如果给定输入参数/ URL会自动找到要调用的方法?

我不想要所有的功能@RequestMapping(当然不能直接访问HttpServletRequest/ HttpServletResponse例如).我想要做的有点像HttpServletRequest的模拟,但没有servlet和所有的所有开销.它应该是"生产"代码,而不是测试中使用的代码.

否则,我没有反对使用别的东西@RequestMapping,只要我能在URI和Java方法之间实现相同类型的映射,自动获取从URI中提取的参数.自定义Spring Integration路由器?我知道SI有一些request-mapping支持,但只能通过HTTP看到我所看到的.

Gar*_*ell 1

目前尚不完全清楚您在寻找什么;您已经说过您正在通过确定控制器中的交换/路由密钥来路由到后端应用程序。

如果您的意思是每个后端服务需要处理多种请求类型并且需要进一步路由,那么,是的,路由器可能是最好的解决方案。

问题是如何将该信息(路由)传递到后端 - 大概是在消息属性/标头中。

您是正确的,SI 仅在 HTTP 端点内部使用请求映射,但是没有什么可以阻止您编写使用相同注释的基于注释的路由器。