重复请求映射

问题描述:

我正在开发一个名为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映射”。 那么无论如何克服这种情况呢?

+0

你有没有试过任何答案? – jelies 2012-08-14 07:13:23

您必须创建另一个@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"; 
    } 
} 

没有办法推翻现有@RequestMapping。每个映射必须是唯一的。你可以做的是以下几点。而不是添加请求参数,添加路径参数这样

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

这将创建一个新的@RequestMapping将从现有的不同。