Search code examples
javaspringspring-bootspring-restcontrollerspring-rest

How to call in RestController method from different Controller in Spring?


I have RestController which look like this:

@RestController
@RequestMapping("/api")
public class SimulationController {

@Autowired
    private SimulationRepository simulationRepository;

@PostMapping("/simulations")
    public Simulation createSimulation(@Valid @RequestBody Simulation simulation){
        simulationRepository.save(simulation);
       
        return simulation;

    }
}

I would like to know how can I pass simulation object to other Controller which can process data and save it to other repository. For example it could look like this:

@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(...));
    }
}

But I know that this approach is not allowed. Is there any way to do this?


Solution

  • I think you can use a @Service instead of a @Controller in your SimulationProcess class, you can inject it to your first controller and use it, but you can't map requests to a service (I think).

    @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);
        }
    }
    

    I hope it helps. And sorry for any mistakes, english is not my first language :D