如何定义RequestMapping优先级

时间:2012-09-28 21:01:44

标签: java spring spring-mvc

我的情况是需要以下RequestMapping

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

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

存在明显的冲突。我希望Spring会自动解决这个问题并将/support映射到第二个方法,将其他所有内容映射到第一个方法,但它会将/support映射到第一个方法。

如何告诉Spring允许明确的RequestMapping在同一个地方覆盖RequestMapping PathVariable

编辑2:如果/support映射出现在/{section}映射之前,它似乎会起作用。不幸的是,我们有许多控制器包含RequestMapping的众多方法。如何确保具有/{section}映射的控制器最后被初始化?或者预拦截器是否可行?

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

4 个答案:

答案 0 :(得分:4)

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

实施方法:

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

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

例如:

@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}"})

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

答案 1 :(得分:1)

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

我认为您需要在/support之前初始化/{section}映射。

要实现此目的,请尝试定义控制器“部分”取决于控制器“支持”。如果这无助于尝试将两个方法放在一个控制器上并将方法映射到“section”之前的“support”

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

祝你好运。

答案 2 :(得分: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。

我希望这会有所帮助。

答案 3 :(得分:0)

我没有看到Spring 3.1.2的这种行为,它可能是一个较旧的Spring版本的bug。这是一个贯穿始终没有任何问题的要点 - https://gist.github.com/3802254

相关问题