Spring Integration HTTP入站网关路径中的可选参数

时间:2015-01-28 22:59:16

标签: java regex spring spring-integration

我使用Spring Integration来提供一些REST Web服务。我服务的网址类似于

http://myhost/param1_name/param1_value/param2_name/param2_value

当然,我不会只有2个参数,我希望其中有一些"可选"。

我找到了以下链接http://www.nakov.com/blog/2009/07/15/jax-rs-path-pathparam-and-optional-parameters/

中描述的解决方案

不幸的是,它不适用于Spring Integration。在Spring Integration中,每当我尝试使用regexp [^ /]来创建参数时,这都不起作用。

例如,firstName永远不会像这样匹配: 路径=" /注册/的firstName / {姓:[^ /] +} / lastName的/"

任何想法,如何使用Spring Integration实现可选参数?

1 个答案:

答案 0 :(得分:1)

我与Rossen Stoyanchev就此事进行了讨论,他发现你原来的做法是错误的。这是他的话:

  

该路径应该反映REST资源的层次结构。编码和内容类型等问题不属于此类。它们是交叉的,可以应用于任何URL。试想一下在每个URL上都支持/encoding/utf-8/format/pdf的REST API。在Spring MVC中,我们甚至支持通过查询参数(例如format=pdf)或文件扩展名(.pdf)进行内容协商,作为使用Accept标头的第一类机制(基于{{ 1}})。这是一种常见的做法,我无法想象为什么有人会想到将这些信息放在路径变量中。

     

他确实有ContentNegotiationStrategy和可选firstName的示例。我也不认为这也是一个好主意。首先,即使不经常,也可以改变名称。还要考虑一个人可以出现在REST API中的所有地方。现在,您必须在任何地方支持lastName和可选的firstName。例如。 lastName

     

似乎这两个示例都试图将随机数据放在属于查询参数或请求正文的URL路径中。 路径应反映资源的层次结构

     BTW参考文章实际上说JAX-RS不支持可选路径变量。他将其描述为黑客。

因此,如果您可以将/person/{firstName}/{lastName}/children/{firstName}/{lastName}部分移动到请求参数并使用一些通用optinal来映射它们,那会更好。或者...... path@RequestMapping选项,允许将方法映射到网址,如果它包含或不包含特定的参数。