我正在开发一个名为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 :(得分: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}}。