7

我有一种情况,我需要以下内容RequestMapping

@RequestMapping(value={"/{section}"})
...method implementation here...

@RequestMapping(value={"/support"})
...method implementation here...

有明显的冲突。我希望 Spring 会自动解决这个问题并映射/support到第二种方法,而其他一切都映射到第一种方法,但它会映射/support到第一种方法。

我如何告诉 Spring 允许在同一个地方显式地用 aRequestMapping覆盖 a ?RequestMappingPathVariable

编辑2:/support如果映射在映射之前,它似乎会起作用/{section}。不幸的是,我们有几十个控制器,其中包含许多带有RequestMapping. 如何确保具有/{section}映射的控制器最后初始化?或者预拦截器是要走的路吗?

编辑1:这是简化的,我知道RequestMapping单独拥有这两个没有多大意义)

4

4 回答 4

4

使用 Spring,您可以扩展 org.springframework.web.HttpRequestHandler 以支持您的方案。

实现方法:

@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}

使用它来分析传入的请求,确定请求 url 是否是您的请求 url 的特殊子集的一部分,并转发到适当的位置。

前任:

@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
/** You will want to check your array of values and have this data cached  **/
if (urlPath.contains("/sectionName")) {
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("sections" + "/" + urlPath);
        requestDispatcher.forward(request, response);
    }

}

并设置您的部分,例如:

@RequestMapping(value={"/sections/{sectionName}"})

这不会干扰任何预先存在的控制器映射。

于 2012-10-01T14:36:24.423 回答
1

这似乎不是问题,这是一个有效的映射。如果你看看http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates

16.3.2 使用 @RequestMapping 映射请求部分中存在两种方法,它们的作用与您尝试的完全相同。

为确保您的类正在编译,请尝试在类级别添加 @RequestMapping("/someprefix") 以查看 URL 是否按照您的需要公开。

我使用版本 3.1.0.RELEASE 在本地验证您的示例,并且没有出现问题。

作为一种解决方法(也为了提供一个易于理解的 REST URI,向您的第二个映射添加一些上下文:

@RequestMapping(value={"client/support"}) // i.e: if you are working with clients
public ModelAndView getsupport(@PathVariable Long supportId){
    // do your code here something here
  }

当然,如果这是系统中存在的唯一控制器,则这是有效的,否则您必须按照我上面的建议在类级别使用 RequestMapping。

我希望这有帮助。

于 2012-09-28T22:05:03.607 回答
1

如果 2 这些方法是在 2 个不同的控制器中定义的,那么您的问题是您有 2 个控制器映射到相同的 URL。您现在无法控制控制器初始化的顺序,因此顺序是随机的。

我认为您需要/support先初始化映射/{section}

为了实现这一点,尝试定义控制器“部分”取决于控制器“支持”。如果这无济于事,请尝试将两种方法放在一个控制器上,并将映射到“支持”的方法放在“部分”之前

我这在这里不起作用是其他建议。什么是“节”?如果它可以接受有限数量的值,则应将其定义为enum. 我相信在这种情况下,如果支持和部分方法在一个控制器或单独的控制器中,一切都会按要求工作。

祝你好运。

于 2012-09-28T21:35:44.227 回答
0

我在 Spring 3.1.2 中没有看到这种行为,它可能是旧 Spring 版本的错误。这是一个对我来说没有任何问题的要点 - https://gist.github.com/3802254

于 2012-09-28T21:51:37.667 回答