Как переопределить @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);
    }
}