Допустим, я хочу создать API для отдыха для хранения информации об автомобиле.Чтобы упростить этот пост, скажем, я бы хотел, чтобы он выглядел следующим образом:
/api/cars/{carmake}/save
/api/cars/{carmake}/edit
/api/cars/{carmake}/delete
Теперь, скажем, у меня несколько марок автомобилей, и для каждого из них потребуются разные услуги, например,BmwService, MercedesService, AudiService.
Так что это моя идея: один абстрактный контроллер, который будет выглядеть примерно так:
@RequestMapping(value="/api/cars/")
public abstract class CarController {
protected final String CAR_MAKE;
public CarController(String carMake){
this.CAR_MAKE = carMake;
}
@PostMapping(value = CAR_MAKE + "/save")
public abstract void save(@Valid @RequestBody Serializable car)
@DeleteMapping(value = CAR_MAKE + "/delete")
public abstract void save(@Valid @RequestBody Serializable car);
@PatchMapping(value = CAR_MAKE + "/edit")
public abstract void save(@Valid @RequestBody Serializable car)
}
И тогда фактический контроллер может выглядеть примерно так:
@RestController
public class AudiController extends CarController {
private AudiService audiService;
@Autowired
public AudiController(AudiService audiService){
super("audi");
this.audiService = audiService;
}
@Override
public void save(@Valid @RequestBody Serializable car) {
audiService.save((Audi) car);
}
.
.
.
}
Проблема в том, что spring не позволяет мне иметь значение для сопоставления запроса с конечной переменной, если она инициализируется через конструктор (если CAR_MAKE инициализируется прямо в объявлении поля, например. protected final String CAR_MAKE = "s"
оно работает).Так есть ли способ обойти это так, чтобы пути могли прийти из каждого подкласса?