#java #spring #spring-boot #spring-restcontroller #spring-rest
#java #весна #spring-boot #spring-restcontroller #spring-rest
Вопрос:
У меня есть 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(...));
}
}
Но я знаю, что этот подход не разрешен. Есть ли какой-нибудь способ сделать это?
Комментарии:
1. Вы должны создать объект RestTemplate и вызвать его как простого потребителя Rest.
2. Почему бы вам не перенести свою логику в такие сервисы, как FirstService (с первым репозиторием) и SecondService (со вторым репозиторием), и вы вводите эти сервисы там, где они вам нужны?
3. Другое дело: почему SimulationProcess (который выглядит как очень плохое имя для меня :)) должен быть контроллером? Я не вижу в нем ни одной конечной точки. Вы хотите, чтобы это было @Service.
Ответ №1:
Я думаю, вы можете использовать @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
Комментарии:
1. Да, спасибо, теперь это работает. Но не могли бы вы сказать мне, знаете ли вы, почему я получаю только одно сохранение во secondRepository, когда я делаю это в цикле for в методе public void simulate?
2. Когда я делаю это, создавая новый объект secondRepository.save(новое моделирование (…) вместо secondRepository.save(моделирование), это работает. Почему?
3. @Sikorkaa пожалуйста, покажите, как выглядит ваш цикл, кажется, проблема здесь или попробуйте отладить ее самостоятельно