春季启动不等待请求

昨天我得到了非常奇怪的春季开机行为

例如:我试图启动服务器使用./gradlew bootRun

 ... :findMainClass :bootRun :: Spring Boot :: (v1.3.1.RELEASE) 2016-01-19 16:37:15.315 INFO 6118 --- [ main] ceserver.Application$Companion : Starting Application.Companion on fake with PID 6118 (/home/user/code/xproject/server/build/classes/main started by user in /home/user/code/xproject/server) 2016-01-19 16:37:15.320 INFO 6118 --- [ main] ceserver.Application$Companion : No active profile set, falling back to default profiles: default 2016-01-19 16:37:15.400 INFO 6118 --- [ main] scaAnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@a3ec6b: startup date [Tue Jan 19 16:37:15 GMT 2016]; root of context hierarchy 2016-01-19 16:37:17.908 INFO 6118 --- [ main] osjeaAnnotationMBeanExporter : Registering beans for JMX exposure on startup 2016-01-19 16:37:17.923 INFO 6118 --- [ main] ceserver.Application$Companion : Started Application.Companion in 3.048 seconds (JVM running for 3.421) 2016-01-19 16:37:17.924 INFO 6118 --- [ Thread-2] scaAnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@a3ec6b: startup date [Tue Jan 19 16:37:15 GMT 2016]; root of context hierarchy 2016-01-19 16:37:17.930 INFO 6118 --- [ Thread-2] osjeaAnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown BUILD SUCCESSFUL Total time: 23.756 secs 

所以它不会像往常一样等待请求。 我认为classpath有一些问题,所以我在控制器和服务中使用了@PostConstruct作为注释的方法,并且可以确认它们被调用,并且所有的依赖关系都被注入。

这是我的gradle.build:

 buildscript { ext.kotlin_version = '1.0.0-beta-4584' repositories { mavenCentral() jcenter() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.1.RELEASE") } } apply plugin: 'java' apply plugin: 'idea' apply plugin: 'spring-boot' apply plugin: 'kotlin' jar { baseName = 'xproject' version = '0.1.0' } repositories { mavenCentral() jcenter() } dependencies { compile("org.springframework.boot:spring-boot-starter-web") compile("org.springframework.boot:spring-boot-starter-tomcat") compile("org.springframework.boot:spring-boot-devtools") compile 'org.springframework.data:spring-data-mongodb:1.8.2.RELEASE' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "com.restfb:restfb:1.18.1" testCompile("junit:junit") testCompile("org.springframework.boot:spring-boot-starter-test") } sourceSets { main { java.srcDirs += ['java', 'kotlin'] } test { java.srcDirs += 'test' } } 

UPD#1

这里是应用程序类(我从一开始就没有触及它)。

 @SpringBootApplication open class Application { companion object { @JvmStatic fun main(args: Array<String>) { SpringApplication.run(Application::class.java, *args) } } } 

UPD#2

小型独立代码

 @RestController @SpringBootApplication @ComponentScan public class GreetingController { public static void main(String[] a) { SpringApplication.run(GreetingController.class, a); } @PostConstruct public void postConstruct() { System.out.println("!! Post construct called"); } private static final String template = "Hello, %s!"; private final AtomicLong counter = new AtomicLong(); @RequestMapping("/greeting") public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { return new Greeting(counter.incrementAndGet(), String.format(template, name)); } } 

给我几乎相同的结果

  :: Spring Boot :: (v1.3.1.RELEASE) 2016-01-19 17:18:19.790 INFO 8230 --- [ restartedMain] hello.GreetingController : Starting GreetingController on fake with PID 8230 (/home/user/code/xproject/server/build/classes/main started by user in /home/user/code/xproject/server) 2016-01-19 17:18:19.814 INFO 8230 --- [ restartedMain] hello.GreetingController : No active profile set, falling back to default profiles: default 2016-01-19 17:18:19.918 INFO 8230 --- [ restartedMain] scaAnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@71ceb8: startup date [Tue Jan 19 17:18:19 GMT 2016]; root of context hierarchy !! Post construct called 2016-01-19 17:18:22.860 INFO 8230 --- [ restartedMain] osbdaOptionalLiveReloadServer : LiveReload server is running on port 35729 2016-01-19 17:18:22.905 INFO 8230 --- [ restartedMain] osjeaAnnotationMBeanExporter : Registering beans for JMX exposure on startup 2016-01-19 17:18:22.922 INFO 8230 --- [ restartedMain] hello.GreetingController : Started GreetingController in 4.022 seconds (JVM running for 4.949) 2016-01-19 17:18:22.924 INFO 8230 --- [ Thread-8] scaAnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@71ceb8: startup date [Tue Jan 19 17:18:19 GMT 2016]; root of context hierarchy 2016-01-19 17:18:22.930 INFO 8230 --- [ Thread-8] osjeaAnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown Process finished with exit code 1 

我刚才所描述的完全一样的问题,在我的情况下,我忘了添加spring-boot-starter-web作为依赖。 我从一个基本的例子复制/粘贴了依赖关系,只是有一个spring-boot-starter,我误解了它。 一旦我添加它,容器正常启动,我有一个正常的web应用程序在8080端口监听。

这是我的第一个非常基本的测试,所以它只有spring-boot-starter-web,kotlin-stdlib和kotlin-reflect作为依赖和类,如下所示:

 @SpringBootApplication class Application { private val log = LoggerFactory.getLogger(Application::class.java) } fun main(args: Array<String>) { SpringApplication.run(Application::class.java, *args) } 

从我在代码中看到的东西,我能想到的唯一的事情就是你也可能需要kotlin-reflect。 我有从这个博客文章包括它的想法, 这个示例项目也使用它…祝你好运!