【问题标题】:Why RestController doesn't work in Spring Boot?为什么 RestController 在 Spring Boot 中不起作用?
【发布时间】:2020-07-03 21:24:02
【问题描述】:

我有一个带有 REST 控制器的 Spring Boot Starter,运行良好:

@RestController
public class SimpleController {

    @GetMapping("/") 
    public String helloWorld() {
        return "Hello world"; 
    }

}

但是,当我添加其他具有无限循环的控制器时,REST 控制器不起作用:

Error: connect ECONNREFUSED 127.0.0.1:8080

是其他Controller的示例代码。

@Component 
public class HelloWorld {

    @Autowired
    public void hello() 
    {
        while(true) {
            System.out.println("Hello world!");
            Thread.sleep(12000);
        } 
    }
}

因此,其他控制器(HelloWorld 类)始终在工作,而 RestController(SimpleController 类)仅在其他控制器被禁用时才起作用。 为什么会这样?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    要添加到已接受的答案,您可以使用 CommandLineRunnerApplicationRunner 之类的实现

    package com.example.restservice;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;
    
    @Component
    public class CommandRunner implements CommandLineRunner {
    
        @Autowired
        private HelloWorld helloWorld;
    
        @Override
        public void run(String... args) throws Exception {
            while (true) {
                System.out.println("Hello world!" +  helloWorld);
                Thread.sleep(12000);
            }
        }
    }
    

    【讨论】:

    • 或者您使用@Scheduled 方法,这样您就没有无限循环代码的味道?
    • 是的。这对您的用例来说是更好的选择
    • @KavithakaranKanapathippillai 非常感谢您出色的解释和代码示例。感谢您分享您的知识!
    • 在现实世界中,计划作业是实现“无限循环”的最佳方式。对于沙箱,您可以使用工作线程等...
    【解决方案2】:

    那是因为您的应用程序永远无法正常启动。当 Spring 尝试创建 bean 实例、设置依赖项和整个基础设施时,它会启动一个无限循环。它坚持下去,所以你的服务器永远不会完成启动,应用程序上下文永远不会设置。请注意,启动(大部分)在主线程上运行,而您将其阻塞。

    【讨论】:

    • 感谢您的回复。事实上,我可以在日志中看到应用程序尚未完成初始化阶段。那么我是否为循环创建了一个并行线程来解决问题?
    • 这取决于,你想达到什么目标?
    • 我只想让这两个控制器同时工作。
    • 如果你想测试这个行为,那么是的,你可以在其他线程上启动它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2016-06-23
    • 2021-01-10
    • 2021-07-07
    • 2019-07-03
    相关资源
    最近更新 更多