Spring boot不会等待请求

时间:2016-01-19 16:53:45

标签: spring spring-boot

昨天我的弹簧启动行为非常奇怪

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

... 
:findMainClass
:bootRun

 :: Spring Boot ::        (v1.3.1.RELEASE)

2016-01-19 16:37:15.315  INFO 6118 --- [           main] c.e.server.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] c.e.server.Application$Companion         : No active profile set, falling back to default profiles: default
2016-01-19 16:37:15.400  INFO 6118 --- [           main] s.c.a.AnnotationConfigApplicationContext : 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] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-01-19 16:37:17.923  INFO 6118 --- [           main] c.e.server.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] s.c.a.AnnotationConfigApplicationContext : 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] o.s.j.e.a.AnnotationMBeanExporter        : 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

这是Application类(我从一开始就没碰过它)。

@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] s.c.a.AnnotationConfigApplicationContext : 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] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2016-01-19 17:18:22.905  INFO 8230 --- [  restartedMain] o.s.j.e.a.AnnotationMBeanExporter        : 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] s.c.a.AnnotationConfigApplicationContext : 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] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

Process finished with exit code 1

1 个答案:

答案 0 :(得分:0)

我遇到了与你刚才描述完全相同的问题,在我的情况下,我忘了添加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。我想到了从blog post中加入它this sample projectLucene query syntax也使用了它... 祝你好运!