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

У меня есть 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(...));
    }
}

Но я знаю, что такой подход недопустим. Есть какой-либо способ сделать это?

Вы должны создать объект RestTemplate и вызвать его как простого потребителя Rest.

Avinash Sagar 19.12.2020 13:03

Почему бы вам не перенести свою логику в такие сервисы, как FirstService (с первым репозиторием) и SecondService (со вторым репо), и не внедрить эти сервисы там, где они вам нужны?

burm87 19.12.2020 13:04

Другое дело: почему SimulationProcess (что мне кажется очень плохим именем :) ) должен быть контроллером? Я не вижу в нем никакой конечной точки. Вы хотите, чтобы это был @Service.

burm87 19.12.2020 13:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
1 528
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Да, спасибо, теперь работает. Но не могли бы вы сказать мне, если вы знаете, почему я получаю только одно сохранение во secondRepository, когда я делаю это в цикле for в методе публичного моделирования пустоты?

Sikorkaa 19.12.2020 23:55

Когда я делаю это, создавая новый объект secondRepository.save(new Simulation(...) вместо secondRepository.save(simulation), он работает. Почему?

Sikorkaa 20.12.2020 00:08

@Sikorkaa, пожалуйста, покажите, как выглядит ваш цикл, похоже, здесь проблема, или попробуйте отладить его самостоятельно.

barbariania 20.12.2020 01:01

Другие вопросы по теме