Дочерний контроллер в весенней загрузке - PullRequest
0 голосов
/ 16 февраля 2019

Давайте представим сценарий, в котором у меня есть приложение Spring Boot (в шаблоне контроллер / сервис / репозиторий), которое содержит контроллер для автомобилей.Теперь я хотел бы создать пути, которые выглядят, например, так:

"/api/cars/bmw"
"/api/cars/mercedes"
"/api/cars/audi"

И так далее.И для каждого из этих производителей автомобилей я хотел бы иметь несколько конечных точек, некоторые из которых являются общими для всех производителей автомобилей (не уверен, что это действительно имеет значение, но просто ради этого, скажем, например, «/ order» и «/ cancelOrder»), но некоторые из них разные.

Теперь, что будет правильным способом реализации этого сценария?Есть ли способ создать CarController для пути /car/{producer}, который был бы прокси для других контроллеров, таких как AudiController, обрабатывающих запросы /car/audi?Хорошо иметь 3 производителя автомобилей в одном контроллере, и сервис для каждого производителя автомобилей - это нормально, но наличие 30 может привести к множеству введенных зависимостей (30 сервисов, введенных в контроллер), если у меня будет только один CarController.

Я полагаю, что среда node.js Express позволит нам сделать это в сценарии "контроллера" машины (не уверен, что они называются контроллерами в экспрессе или как):

var app = express();
app.use('/audi', '{path to audi controller script}');

Isесть ли подобная возможность весной?Или это может быть плохая идея, антипаттерн?

Другая идея, которая довольно проста, но кажется не слишком элегантной, состоит в том, чтобы пропустить CarController и реализовать:

  • AudiController с @RequestMapping("/api/cars/audi")

  • BmwController с @RequestMapping("/api/cars/bmw")

  • MercedesController с @RequestMapping("/api/cars/mercedes")

и т. Д.

Итак, что было бы лучшей идеей здесь?

1 Ответ

0 голосов
/ 16 февраля 2019

Spring имеет @PathVariable для этого, что можно использовать следующим образом:

@RestController
@RequestMapping("/api/cars/")
public class MyController {

    @GetMapping
    @RequestMapping("{producer}/cancelOrder")
    public String cancelOrder(@PathVariable String producer) {
        return "Cancel order for " + producer;
    }
}

Мы можем назвать эту конечную точку следующим образом: http://localhost:8080/api/cars/Mercedes/cancelOrder

Нет такоговещь, как дочерний контроллер весной.Если вы хотите создать отдельный контроллер для каждого производителя, имеющего некоторые общие функции, вы можете использовать наследование:

Класс родительского контроллера (обратите внимание, что в нем нет аннотации Controller):

@RequestMapping("/api/cars/")
public class BaseCarController {
    @GetMapping("/common")
    public String common() {
        return "Common stuff";
    }
}

Дочерние контроллеры классов:

@RestController
public class MercedesController extends BaseCarController{

    private MercedesService mercedesService;

    // Spring will autowire this by default, no need to add @Autowired
    public MercedesController(MercedesService mercedesService) {
        this.mercedesService = mercedesService;
    }

    @GetMapping
    @RequestMapping("Mercedes/cancelOrder")
    public String cancelOrder() {
        return "Cancel order for Mercedes.";
    }
}

@RestController
public class AudiController extends BaseCarController{
    private AudiService audiService;

    // Spring will autowire this by default, no need to add @Autowired
    public AudiController(AudiService audiService) {
        this.audiService = audiService;
    }

    @GetMapping
    @RequestMapping("Audi/cancelOrder")
    public String cancelOrder() {
        return "Cancel order for Audi.";
    }
}

Мы можем вызывать определенные конечные точки, например: http://localhost:8080/api/cars/Mercedes/cancelOrder или http://localhost:8080/api/cars/Audi/cancelOrder.Более того, мы можем вызвать общую конечную точку следующим образом: http://localhost:8080/api/cars/common

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...