Struts2 对于Struts中的ambigous通配符模式(在V2.1.9之前),我可以使用什么解决方法?

Struts2 对于Struts中的ambigous通配符模式(在V2.1.9之前),我可以使用什么解决方法?,struts2,design-patterns,wildcard,Struts2,Design Patterns,Wildcard,在Struts中,我很难找到正确的通配符模式来将URL的一部分提取到动作参数中 这就是我设置动作的方式。该模式的目的是捕获最后两个path元素,然后捕获它们前面的所有元素 <action name="**/*/*" class="com.example.ObjectAction"> <param name="filter">{1}</param> <param name="type">{2}</param> <para

在Struts中,我很难找到正确的通配符模式来将URL的一部分提取到动作参数中

这就是我设置动作的方式。该模式的目的是捕获最后两个path元素,然后捕获它们前面的所有元素

<action name="**/*/*" class="com.example.ObjectAction">
  <param name="filter">{1}</param>
  <param name="type">{2}</param>
  <param name="id">{3}</param>
</action>
应该是:

<result>
    <filter>channels/123</filter>
    <id>456</id>
    <type>transmissions</type>
</result>

频道/123
456
传输
现在,因为
**
匹配所有字符,包括斜杠,我想我的模式允许多种方式匹配URL,Struts恰好选择了一种将
id保持为空的方式。是否在某个地方定义了多个可能匹配的行为?我能让图案不那么模棱两可吗?有没有其他方法可以做到这一点


我正在运行Struts 2.0.8。升级到2.1.9会给我提供正则表达式匹配,但当我超过2.0.8时,我遇到了Struts依赖项和我的OSGi环境的问题,所以我现在想继续使用该版本。

这是比特定于结构更一般的建议,但这里是

如果在URL中附加一个/(可以在测试结构中的某个点自动完成),那么贪婪的结果就是您看到的结果

我会仔细检查,以确保您正在以某种方式请求您认为是的URL,或者查看是否有方法指定+(也称为非空结果)


编辑:要回答整个问题,很难判断匹配是否贪婪,因为解析器通常会返回第一个“有效”结果,这可能相当于贪婪的结果,具体取决于您所处的位置。

这是比特定于结构更一般的建议,但这里是

如果在URL中附加一个/(可以在测试结构中的某个点自动完成),那么贪婪的结果就是您看到的结果

我会仔细检查,以确保您正在以某种方式请求您认为是的URL,或者查看是否有方法指定+(也称为非空结果)


编辑:要回答整个问题,很难判断匹配是否贪婪,因为解析器通常会返回第一个“有效”结果,这可能相当于贪婪结果,具体取决于您的位置。

我认为struts2通配符在这一点上还不够成熟。
不要对更复杂的模式提供任何指导。但是由于
**
匹配所有项,包括斜杠,我猜struts2会将最后一个斜杠之前的所有项作为一个单位,因此将其设置为第一个占位符,并将最后一个通配符设置为第二个。这就是为什么第三个占位符仍然为空。

我建议您升级,因为struts 2.1+提供了模式匹配,这对您的情况可能更有用。

我认为struts2通配符当时还不够成熟。
不要对更复杂的模式提供任何指导。但是由于
**
匹配所有项,包括斜杠,我猜struts2会将最后一个斜杠之前的所有项作为一个单位,因此将其设置为第一个占位符,并将最后一个通配符设置为第二个。这就是为什么第三个占位符仍然为空。

我建议您升级,因为(您非常清楚)struts 2.1+提供了模式匹配,这对您的情况可能更有用。

是的,我检查了我正在调用的URL,我想我是。添加“/”将导致整个路径在
过滤器中结束。我认为我的问题很大程度上取决于Struts如何处理这个问题的一些细节。在我对我的问题有了更清楚的了解之后,我几乎完全重新表述了我的问题。很抱歉,如果这使您的答案看起来很奇怪。如果2.1.9给出了更好的错误消息,那么请尝试让它在该版本中工作,然后进行后端口,如果它使用相同的逻辑并进行了一些额外的检查,那么这个技巧应该会起作用。如果它是一个不同的方法,那么显然它不会有错误消息。URL已被解析,并且从技术角度来看,正确无误。它只是没有按照我的预期工作。是的,我检查了我正在调用我认为我是的URL。添加“/”将导致整个路径在
过滤器中结束。我认为我的问题很大程度上取决于Struts如何处理这个问题的一些细节。在我对我的问题有了更清楚的了解之后,我几乎完全重新表述了我的问题。很抱歉,如果这使您的答案看起来很奇怪。如果2.1.9给出了更好的错误消息,那么请尝试让它在该版本中工作,然后进行后端口,如果它使用相同的逻辑并进行了一些额外的检查,那么这个技巧应该会起作用。如果它是一个不同的方法,那么显然它不会有错误消息。URL已被解析,并且从技术角度来看,正确无误。它只是没有像我所希望的那样工作。这个问题还没有解决吗?如果是这样,您可能希望在struts2社区中将此作为问题提交。@doctrey-我的另一种方法是解决升级问题并使用2.1.x中引入的正则表达式匹配,但对我和我的版本来说,是的,它仍然没有解决。如果已经发布了一个有效的解决方案,我怀疑Struts的人是否会在意。一个声音“你不能这么做,原因就在这里”是一个可以接受的答案,尽管我不喜欢这样的回答。:)我是说,我想我可以升级。不升级的原因是什么?我可以理解您是否使用struts 1,但如果您以正常方式使用struts 2,升级应该是无痛的。这仍然没有解决吗?如果是这样,您可能希望在struts2社区中将此作为问题提交。@doctrey-我的另一种方法是解决升级问题并使用2.1.x中引入的正则表达式匹配,但对我和我的版本来说,是的,它仍然没有解决。如果已经发布了一个有效的解决方案,我怀疑Struts的人是否会在意。一个声音“你不能这么做,原因就在这里”是一个可以接受的答案,尽管我不喜欢这样的回答。:)我是说,我想我可以
<result>
    <filter>channels/123</filter>
    <id>456</id>
    <type>transmissions</type>
</result>