Как переопределить @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
?
Ответы
Ответ 1
Отображение 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";
}
}
Пример: теперь, если вы вызываете ваш хост /helloWorld? type = 42 MyHelloWorldController
, ответьте на запрос
Кстати.
Контроллер не должен быть динамическим поставщиком контента. Вам нужен экземпляр @Service
. Таким образом, вы можете реализовать Controller один раз и использовать несколько сервисов. Это основная идея 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";
}
}
Ответ 2
Каждое сопоставление должно быть уникальным.. Нет способа отменить существующий @RequestMapping
.
НО Вы всегда можете сделать некоторые обходные пути:
Используйте параметр в запросе, как это создаст новый @RequestMapping
, который будет отличаться от существующего.
@RequestMapping("/helloWorld/{someDataId}", method = RequestMethod.GET)
public String helloWorld(@PathVariable("someDataId") final long id, Model model) {
/* your code here */
}
Или создайте еще один @Controller
, расширяющий существующий:
public class YourController extends BaseController {
@Override
@RequestMapping("/helloWorld")
public void renderDashboard(Model model){
// Call to default functionallity (if you want...)
super.renderDashboard(patientId, map);
}
}