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

时间:2015-10-08 09:26:44

标签: 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

理想情况下,我希望每个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请求,将其发送到正确的应用程序,可以处理它,将答案发回给主应用程序,该应用程序将响应转发给客户端。这里没问题。

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

问题

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

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

    (...)
    return project;
}

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

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

否则,我没有反对使用除@RequestMapping以外的其他内容,前提是我可以在URI和Java方法之间实现相同类型的映射,自动获取从URI中提取的参数。自定义Spring Integration路由器?我知道SI有一些request-mapping支持,但仅比我见过的HTTP支持。

1 个答案:

答案 0 :(得分:1)

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

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

问题是你将如何将这些信息(路由)传递给后端 - 可能是在消息属性/标题中。

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