如何定义RequestMapping优先级
我有一种情况需要以下RequestMapping
:
@RequestMapping(value={"/{section}"}) ...method implementation here... @RequestMapping(value={"/support"}) ...method implementation here...
有一个明显的冲突。 我希望Spring会自动解决这个问题并将映射/support
解决到第二种方法,而其他所有方法都放在第一种方法中,但它会映射/support
第一种方法。
我如何告诉Spring允许显式RequestMapping
在同一个地方覆盖带有PathVariable
的RequestMapping
?
编辑2:如果/support
映射出现在/{section}
映射之前,它似乎可以工作。 不幸的是,我们有许多控制器包含许多使用RequestMapping
方法。 如何确保具有/{section}
映射的控制器最后被初始化? 或者预拦截器是否可行?
编辑1:这是简化的,我知道单独使用这两个RequestMapping
会没有多大意义)
使用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}"})
这不会干扰任何预先存在的控制器映射。
如果2这些方法在2个不同的控制器中定义,则问题在于您有2个控制器映射到同一个URL。 您现在无法控制控制器初始化的顺序,因此顺序是随机的。
我认为你需要/support
映射在/{section}
之前进行初始化。
为实现此目的,尝试定义控制器“部分”取决于控制器“支持”。 如果这样做无助于尝试将两个方法放在一个控制器上并将方法映射到“section”之前的“support”
我这不起作用是其他建议。 什么“部分”是? 如果它可以接受有限数量的值,则应将其定义为enum
。 我相信在这种情况下,如果支持和节方法在一个控制器或单独的控制器中,一切都将按要求工作。
祝你好运。
这似乎不是问题,这是一个有效的映射。 如果你看看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在本地validation您的示例,并且没有问题。
作为一种解决方法(并且还提供一个易于理解的REST URI,为您的第二个映射添加一些上下文:
@RequestMapping(value={"client/support"}) // ie: if you are working with clients public ModelAndView getsupport(@PathVariable Long supportId){ // do your code here something here }
当然,如果这是系统中存在的唯一控制器,则这是有效的,否则您必须按照我上面的建议在类级别使用RequestMapping。
我希望这有帮助。
我没有看到Spring 3.1.2的这种行为,它可能是一个较旧的Spring版本的bug。 这是一个贯穿始终没有任何问题的要点 – https://gist.github.com/3802254