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

Vic*_*loy 18 java spring-mvc

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

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

原控制器:

@Controller
public class HelloWorldController {

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

新控制器:

@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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

die*_*ter 15

无法覆盖作为注释的URL映射.如果两个或更多控制器配置了相同的请求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";
    }

}
Run Code Online (Sandbox Code Playgroud)

示例:现在,如果您调用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";
    }

}
Run Code Online (Sandbox Code Playgroud)