0

我正在开发一个名为 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 映射”。那么有没有办法克服这种情况呢?

4

2 回答 2

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";
    }
}
于 2012-07-10T10:54:10.973 回答
0

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

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

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

于 2012-07-10T11:19:33.723 回答