3

我正在研究 Spring MVC 展示示例,并要求您对请求映射主题进行一些简单的解释。

在实践中,我认为我有以下两个链接:

        <li>
            <a id="byParameter" class="textLink" href="<c:url value="/mapping/parameter?foo=bar" />">By path, method, and presence of parameter</a>
        </li>

        <!-- PERSONALE -->
        <li>
            <a id="byParameter2" class="textLink" href="<c:url value="/mapping/parameter?foo2=blabla" />">(PERSONALE) By path, method, and presence of parameter with value="blabla"</a>
        </li>

向“/mapping/parameter/”文件夹生成 HTTP 请求,但它们具有不同的参数

第一个有一个名为 foo 的参数,第二个有一个名为 foo2 的参数

好的...现在我会这样:由第一个链接(参数名为“foo”的链接)生成的 HTTP 请求由方法处理,第二个链接生成的 HTTP 请求(参数名为“foo2”的链接) ) 由其他方法处理

所以,在我的控制器类中,我想以这种方式添加以下两种方法:

@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params="foo")
public @ResponseBody String byParameter() {
    return "Mapped by path + method + presence of query parameter!";
}

@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params="foo2")
public @ResponseBody String byParameter(@RequestParam("foo2") String foo2) {
    return "Mapped by path + method + presence of query parameter! (MappingController). Parameter value = " + foo2;
    }

(其代码中的第二个也是参数值,但我认为这并不重要)

问题是,当我单击第二个链接时,我收到一个错误,并且在堆栈跟踪中我有以下错误消息:

2012 年 11 月 24 日下午 7:56:42 org.apache.catalina.core.StandardWrapperValve 调用严重:servlet [appServlet] 在路径 [/spring-mvc-showcase] 的上下文中的 Servlet.service() 引发异常 [请求处理失败; 嵌套异常是 java.lang.IllegalStateException:映射为 HTTP 路径“http://localhost:8080/spring-mvc-showcase/mapping/parameter”的不明确处理程序方法:{public java.lang.String org.springframework.samples.mvc .mapping.MappingController.byParameter(java.lang.String), public java.lang.String org.springframework.samples.mvc.mapping.MappingController.byParameterNegation()}] 与根本原因 java.lang.IllegalStateException:映射的不明确的处理程序方法对于 HTTP 路径“http://localhost:8080/spring-mvc-showcase/mapping/parameter”:{public java.lang.String org.springframework.samples.mvc.mapping.MappingController.

应用程序似乎无法理解路径“/mapping/parameter”使用哪种方法,但为什么呢?

第一种方法带有 @RequestMapping 注释,明确指定必须处理对“/mapping/parameter”文件夹的 HTTP 请求并具有名为foo的参数,第二个方法是带有 @RequestMapping 的注释,表示必须处理 HTTP 请求“/mapping/parameter”文件夹并具有名为foo2的参数...我不认为这是一个模棱两可的情况

我认为问题不在于这两种方法具有相同的名称,因为它们具有不同的签名,所以它们是两种不同的方法......(我也尝试过重命名第二种方法,但问题仍然存在)

另外,一个奇怪的想法是,如果我单击第一个链接(生成带有名为“foo”的参数的 HTTP 请求的链接),它会被第一种方法正确处理......为什么这不是模棱两可?!?!

我该如何解决?

非常感谢

安德烈亚

4

3 回答 3

4

您的代码是正确的!问题必须在代码中的其他地方。我已经构建了一个简单的项目并复制了您的代码片段,并且它没有任何问题!

您可以从这里下载我的示例(它是一个 Eclipse Maven 项目)。

我认为您的问题是您可能忽略了第三种方法或第二个控制器。

于 2012-11-25T11:14:19.577 回答
0

这看起来像stackoverflow.com/questions/8954426的副本。

您的案例的解决方案:

@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params={"foo", "!foo2"})
@RequestMapping(value="/mapping/parameter", method=RequestMethod.GET, params={"foo2", "!foo"})

请参阅我的完整答案以获取解释

于 2014-06-06T15:04:57.983 回答
0

检查有关使用“参数”的 api。

在 Servlet 环境中,参数映射被视为在类型级别强制执行的限制。主路径映射(即指定的 URI 值)仍然必须唯一标识目标处理程序,参数映射仅表示调用处理程序的先决条件。

于 2012-11-29T09:37:35.037 回答