【问题标题】:Spring Framework HttpRequestHandler failureSpring Framework HttpRequestHandler 失败
【发布时间】:2010-03-29 09:56:33
【问题描述】:

我们有一个应用程序通过客户端发出的 REST 请求进行通信。

REST 请求包含“区域名称”和“ID”作为参数

所以,请求看起来像这样(对于删除)

http://host:port/regionnameID  

联合中区域之间的这些 REST 请求经过正确的 URL 编码

如果区域名称中包含斜杠(“/”),我发现这些请求会失败。

那么,请求应该是这样的

http://host:port/region/nameID  

这是由于在区域名称中有“/”时 HttpRequesthandler 对 Rest URL 的错误解释。

现在,我们无法控制客户端发送区域名称中带有“/”的 REST 请求。

是否有任何方法/配置/解决方法可以防止 HttpRequestHandler 返回 404

【问题讨论】:

  • 这就是为什么这种 REST 风格的 URL 并不总是合适的原因。当您有多种可能的输入时,查询参数会更好。

标签: java spring spring-mvc


【解决方案1】:

您应该使用urlrwrite 重写您的网址并使用内部查询参数。

<rule>
 <name>Inbound:</name>
 <from>^(.*)ID$</from>
 <to last="true">delete?regionName=$1</to>
</rule>

在 web.xml 中的所有其他过滤器之前添加您的 urlrewrite 过滤器

【讨论】:

    【解决方案2】:

    这是一个有点肮脏的问题。我在这里尝试做的是使用 Spring @RequestMapping 注释。这里有一些关于它的文档: http://static.springsource.org/spring/docs/2.5.x/reference/mvc.html

    您可以在传递@RequestMapping 的值中使用特定的ant 通配符。如果您的区域数量有限,则可以将它们全部映射到一个方法,如下所示: @RequestMapping(value={"/region1**","/region2**","/region3**")

    在您的控制器方法中,您必须添加额外的逻辑来解析 nameID。

    如果您有大量区域,我会创建一个单独的 Spring Web 应用程序 (servlet) 来处理这些请求。该应用程序将有一个缓存的区域查找表。

    【讨论】:

      【解决方案3】:

      配置自己的 handlerMapping bean(可能基于AbstractUrlHandlerMapping

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多