如何在另一个控制器中覆盖@RequestMapping?


问题内容

我需要扩展现有的控制器并为其添加一些功能。但是作为项目要求,我无法接触原始控制器,问题是该控制器上有@RequestMapping注释。所以我的问题是我该如何请求/someUrl转到新控制器,而不是旧控制器。

这是一个例子,只是为了澄清我在说什么:

原始控制器:

@Controller
public class HelloWorldController {

    @RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World!");
        return "helloWorld";
    }
}

新控制器:

@Controller
public class MyHelloWorldController {

    @RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World from my new controller");
        // a lot of new logic
        return "helloWorld";
    }
}

如何在不进行编辑的情况下覆盖原始映射HelloWorldController


问题答案:

不能覆盖作为注释的网址映射。如果使用相同的请求url和请求方法配置了两个或更多控制器,则会出现错误。

您可以做的是扩展请求映射:

@Controller
public class MyHelloWorldController {

    @RequestMapping("/helloWorld", params = { "type=42" })
    public String helloWorld(Model model) {
        model.addAttribute("message", "Hello World from my new controller");
        return "helloWorld";
    }

}

示例:现在,如果您调用 yourhost / helloWorld?type = 42 MyHelloWorldController将响应请求


顺便说说。控制器不应为动态内容提供商。您需要一个@Service实例。因此,您可以一次实现Controller并使用多个Service实现。这是Spring
MVC和DI
的主要思想

@Controller
public class HelloWorldController {

    @Autowired
    private MessageService _messageService; // -> new MessageServiceImpl1() or new MessageServiceImpl2() ...

    @RequestMapping("/helloWorld")
    public String helloWorld(Model model) {
        model.addAttribute("message", messageService.getMessage());
        return "helloWorld";
    }

}