重复的RequestMapping

时间:2012-07-10 05:49:36

标签: spring spring-mvc

我正在开发一个名为OpenMRS的开源软件,支持Spring MVC。我以后无法修改核心源以进行更新。所以我必须编写一个模块,比如插件,以便为系统添加功能。问题是我想通过使用portlet重定向到我的jsp来改变我的原始屏幕。核心代码的控制器是这样的:

@RequestMapping("/patientDashboard.form")
    protected String renderDashboard(@RequestParam(required = true, value = "patientId") Integer patientId, ModelMap map){

     ....
     return "patientDashboardForm";
}

我不熟悉Spring,但据我所知,当url以/patientDashboard.form?patientId=xxx结尾时,该函数将调用patientDashboardForm.jsp。现在我想返回我的jsp,所以我必须定义一个具有相同代码的新类,但返回到我的jsp(这样做是因为无法修改核心代码)。但是通过定义相同的映射/patientDashboard.form会导致错误“无法将处理程序XXX映射到URL路径/patientDashboard.form:已经有处理程序YYY映射”。 那么无论如何要克服这种情况呢?

2 个答案:

答案 0 :(得分:0)

您必须创建另一个@Controller扩展现有的@Controller @RequestMapping("/your_new_mapping") public class YourController extends BaseController { @Override @RequestMapping("/patientDashboard.form") public void renderDashboard(@RequestParam(required = true, value = "patientId") Integer patientId, ModelMap map){ // Call to default functionallity super.renderDashboard(patientId, map); ... // your custom code here return "yourCustomJSPHere"; } } 。然后,您可以定义自定义映射(不能重用现有映射)并在方便时重新实现超类方法,重定向到视图并在那里定义自定义逻辑。

示例:

{{1}}

答案 1 :(得分:0)

无法否决现有的@RequestMapping。每个映射必须是唯一的。你能做的是以下几点。而不是添加请求参数,添加像这样的路径参数

@RequestMapping("/patientDashboard.form/{patientId}", method = RequestMethod.GET)
public String renderDashboard(@PathVariable("patientId") final long id, Model model) {
 /* your code here */ 
}

这将创建一个与现有@RequestMapping不同的新{{1}}。