Как вызвать метод RestController с другого контроллера весной?

#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 пожалуйста, покажите, как выглядит ваш цикл, кажется, проблема здесь или попробуйте отладить ее самостоятельно