You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中如何在RestController中调用其他Controller处理数据?

问题分析与解决方案

你遇到的核心问题是:手动new出来的SimulationProcess实例不在Spring容器的管理范围内,所以Spring无法为它注入SecondRepository;另外SimulationProcess也不应该标记为@Controller——这个注解是用来处理HTTP请求的,你的类是业务处理类,应该用业务层的注解。

下面提供两种可行的实现方案,按需选择:


方案一:将SimulationProcess改为Spring管理的Service组件

这是最直接的方案,把业务处理类交给Spring管理,通过依赖注入的方式使用,避免手动实例化。

第一步:修改SimulationProcess为Service

@Service // 用@Service标记,让Spring将其纳入容器管理
public class SimulationProcess {
    private final SecondRepository secondRepository;

    // 推荐使用构造注入(比@Autowired更安全,也符合Spring的最佳实践)
    public SimulationProcess(SecondRepository secondRepository) {
        this.secondRepository = secondRepository;
    }

    // 将simulate方法改为接收参数的形式,替代构造器传入对象
    public void simulate(Simulation simulation){
        // 处理simulation中的数据
        secondRepository.save(new Second(...));
    }
}

第二步:在Controller中注入并使用该Service

@RestController
@RequestMapping("/api")
public class SimulationController {
    private final SimulationRepository simulationRepository;
    private final SimulationProcess simulationProcess; // 注入业务Service

    // 构造注入所有依赖
    public SimulationController(SimulationRepository simulationRepository, SimulationProcess simulationProcess) {
        this.simulationRepository = simulationRepository;
        this.simulationProcess = simulationProcess;
    }

    @PostMapping("/simulations")
    public Simulation createSimulation(@Valid @RequestBody Simulation simulation){
        Simulation savedSimulation = simulationRepository.save(simulation);
        // 调用业务Service的方法,传入对象
        simulationProcess.simulate(savedSimulation);
        return savedSimulation;
    }
}

这样Spring会自动创建SimulationProcess的实例,并正确注入SecondRepository,不会再出现注入失效的问题。


方案二:使用Spring事件驱动(高解耦场景)

如果希望Controller和后续的业务处理逻辑完全解耦,可以用Spring的事件机制:Controller发布事件,业务类监听事件并处理。

第一步:定义事件类

// 自定义事件,用于传递Simulation对象
public class SimulationCreatedEvent extends ApplicationEvent {
    private final Simulation simulation;

    public SimulationCreatedEvent(Object source, Simulation simulation) {
        super(source);
        this.simulation = simulation;
    }

    public Simulation getSimulation() {
        return simulation;
    }
}

第二步:在Controller中发布事件

@RestController
@RequestMapping("/api")
public class SimulationController {
    private final SimulationRepository simulationRepository;
    private final ApplicationEventPublisher eventPublisher; // 注入事件发布器

    public SimulationController(SimulationRepository simulationRepository, ApplicationEventPublisher eventPublisher) {
        this.simulationRepository = simulationRepository;
        this.eventPublisher = eventPublisher;
    }

    @PostMapping("/simulations")
    public Simulation createSimulation(@Valid @RequestBody Simulation simulation){
        Simulation savedSimulation = simulationRepository.save(simulation);
        // 发布事件,通知监听者处理
        eventPublisher.publishEvent(new SimulationCreatedEvent(this, savedSimulation));
        return savedSimulation;
    }
}

第三步:修改SimulationProcess为事件监听器

@Service
public class SimulationProcess {
    private final SecondRepository secondRepository;

    public SimulationProcess(SecondRepository secondRepository) {
        this.secondRepository = secondRepository;
    }

    // 监听SimulationCreatedEvent事件,自动触发处理逻辑
    @EventListener
    public void handleSimulationCreated(SimulationCreatedEvent event){
        Simulation simulation = event.getSimulation();
        // 处理数据并存入仓库
        secondRepository.save(new Second(...));
    }
}

这种方式的优势是完全解耦,后续如果需要新增其他处理逻辑,只需要添加新的事件监听器即可,不需要修改Controller代码。


内容的提问来源于stack exchange,提问作者Sikorkaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:04:01