Spring Integration HTTP入站网关实现@PathVariable式路径参数获取
问题背景
现有基于SpringBoot 2.2.6 + spring-integration的HTTP接口配置如下:
@Bean public MessageChannel reply() { return new DirectChannel(); } @Bean public IntegrationFlow inbound(TestTransformer testTransformer) { return IntegrationFlows.from(Http.inboundGateway("/foo") .requestMapping(m -> m.methods(HttpMethod.GET)) .replyChannel("reply") .requestPayloadType(String.class)) .channel("httpRequest") .get(); } @Bean @ServiceActivator(inputChannel = "httpRequest", outputChannel = "reply") public Function<Message<?>, String> handler() { return new Function<Message<?>, String>() { public String apply(Message<?> message) throws MessagingException { log.info("myHandler: " + message.getPayload()); log.info("myHandler: " + message.getHeaders()); return "ok"; } }; }
当前调用带查询参数的接口http://localhost:8080/MyApp/foo?q=test&q1=test2时,可以正常接收到JSON格式的查询参数。
期望实现类似Spring MVC中@PathVariable的路径参数接收能力,将入站网关路径配置为/foo/{name}形式,直接配置后未生效,需要正确的Java Bean配置实现方案。
解决方案
Spring Integration HTTP入站网关原生支持路径模板参数,配置后未拿到参数的核心原因是:路径变量不会存放在请求payload中,而是统一封装在消息头里。
具体配置和取值方式如下:
- 入站网关路径直接按Spring MVC路径模板语法编写即可,不需要额外配置解析器,示例:
@Bean public IntegrationFlow inbound() { return IntegrationFlows.from(Http.inboundGateway("/foo/{name}") .requestMapping(m -> m.methods(HttpMethod.GET)) .replyChannel("reply") .requestPayloadType(String.class)) .channel("httpRequest") .get(); }注意:全局context-path(比如示例中的
/MyApp)不需要配置在网关路径中,匹配规则和Spring MVC@RequestMapping完全一致。 - 在消息处理逻辑中,从key为
pathVariables的消息头中获取路径参数,该值是一个Map<String, String>结构,key对应路径模板中的占位符名称,示例:@Bean @ServiceActivator(inputChannel = "httpRequest", outputChannel = "reply") public Function<Message<?>, String> handler() { return message -> { // 从消息头取出所有路径变量 Map<String, String> pathVariables = (Map<String, String>) message.getHeaders().get("pathVariables"); // 按占位符名称取对应参数值 String name = pathVariables.get("name"); log.info("路径参数name值: {}", name); log.info("查询参数payload: {}", message.getPayload()); return "ok, param name is " + name; }; }
如果使用注解式消息处理方法,也可以直接用@Header注入路径变量集合:
@ServiceActivator(inputChannel = "httpRequest", outputChannel = "reply") public String handler(String payload, @Header("pathVariables") Map<String, String> pathVariables) { String name = pathVariables.get("name"); return "ok, name is " + name; }
补充说明:
- 该规则对响应式Web栈的
Http.inboundReactiveGateway同样生效,路径变量的消息头key完全一致 - 不需要额外引入依赖,只要项目中已经引入
spring-integration-http组件,默认就支持路径模板解析 - 如果需要自定义路径匹配规则,可以给入站网关注入自定义的
UriTemplateHandler,常规场景使用默认配置即可
内容的提问来源于stack exchange,提问作者CoderJammer
相关产品推荐
相关产品推荐

