У меня есть RestController, который выглядит так:
@RestController
@RequestMapping("/api")
public class SimulationController {
@Autowired
private SimulationRepository simulationRepository;
@PostMapping("/simulations")
public Simulation createSimulation(@Valid @RequestBody Simulation simulation){
simulationRepository.save(simulation);
return simulation;
}
}
Я хотел бы знать, как я могу передать объект моделирования другому контроллеру, который может обрабатывать данные и сохранять их в другом репозитории. Например, это может выглядеть так:
@PostMapping("/simulations")
public Simulation createSimulation(@Valid @RequestBody Simulation simulation){
simulationRepository.save(simulation);
SimulationProcess simulationProcess = new SimulationProcess(simulation);
simulationProcess.simulate();
return simulation;
}
@Controller
public class SimulationProcess {
private Simulation simulation;
@Autowired
private SecondRepository secondRepository;
public SimulationProcess(Simulation simulation) {
this.simulation = simulation;
}
public void simulate(){
// process data from this.simulation
secondRepository.save(new Second(...));
}
}
Но я знаю, что такой подход недопустим. Есть какой-либо способ сделать это?
Почему бы вам не перенести свою логику в такие сервисы, как FirstService (с первым репозиторием) и SecondService (со вторым репо), и не внедрить эти сервисы там, где они вам нужны?
Другое дело: почему SimulationProcess (что мне кажется очень плохим именем :) ) должен быть контроллером? Я не вижу в нем никакой конечной точки. Вы хотите, чтобы это был @Service.




Я думаю, вы можете использовать @Service вместо @Controller в своем классе SimulationProcess, вы можете внедрить его в свой первый контроллер и использовать его, но вы не можете сопоставлять запросы со службой (я думаю).
@RestController
@RequestMapping("/api")
public class SimulationController {
@Autowired
private SimulationRepository simulationRepository;
@Autowired
private SimulationProcess simulationProcess;
@PostMapping("/simulations")
public Simulation createSimulation(@Valid @RequestBody Simulation simulation){
simulationRepository.save(simulation);
simulationProcess.simulate(simulation);
return simulation;
}
}
@Service
public class SimulationProcess {
@Autowired
private SecondRepository secondRepository;
public void simulate(Simulation simulation){
// process data from this.simulation
secondRepository.save(simulation);
}
}
Я надеюсь, что это помогает. И извините за любые ошибки, английский не мой родной язык :D
Да, спасибо, теперь работает. Но не могли бы вы сказать мне, если вы знаете, почему я получаю только одно сохранение во secondRepository, когда я делаю это в цикле for в методе публичного моделирования пустоты?
Когда я делаю это, создавая новый объект secondRepository.save(new Simulation(...) вместо secondRepository.save(simulation), он работает. Почему?
@Sikorkaa, пожалуйста, покажите, как выглядит ваш цикл, похоже, здесь проблема, или попробуйте отладить его самостоятельно.
Вы должны создать объект RestTemplate и вызвать его как простого потребителя Rest.