重复请求映射
问题描述:
我正在开发一个名为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映射”。 那么无论如何克服这种情况呢?
答
您必须创建另一个@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
将从现有的不同。
你有没有试过任何答案? – jelies 2012-08-14 07:13:23