部署到独立Tomcat时,Spring Boot应用程序无法正常工作

时间:2014-07-17 23:12:59

标签: spring-boot spring-data-mongodb spring-data-rest

我跟着this tutorial。现在,如果我通过Spring Boot使用它,它可以工作,但如果我尝试在Apache Tomcat 7上部署它(删除应用程序类),我会收到404响应。我也尝试过自己的配置 - 就像这样:

@Configuration
public class MongoConfiguration {

    public @Bean MongoDbFactory mongoDbFactory() throws Exception {
        return new SimpleMongoDbFactory(new Mongo("127.0.0.1", 27017), "movies");
    }

    public @Bean MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongoDbFactory());
    }
}

它仍然不起作用。所以有2个问题。

  1. 如何在tomcat上运行它(如何简单休息并在tomcat上运行)
  2. 如何通过注释配置mongo(只是为了获取我的数据库)
  3. 注意:默认情况下,它使用测试vile运行spring boot,我可以通过简单的控制器(而不是@RepositoryRestResource)使其工作,但我希望能够卷曲http://localhost:8080并获得选项响应。

4 个答案:

答案 0 :(得分:19)

您是否确定已按照引导参考文档的section on traditional deployments进行操作?根据您的描述,它看起来不像Spring Data REST或MongoDB不起作用,但部署根本不起作用。

诀窍应该是让主配置类实现一个特殊的接口,以便servlet容器可以找到引导程序的配置(从参考文档中获取的样本):

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }
}

SpringBootServletInitializer是这里的关键方面,因为它是挂钩到传统Web应用程序的Servlet 3引导程序机制的类型。在Servlet 3.0之前,参考文档还有instructions如何使引导应用程序在Servlet容器中工作。

另请注意,当应用程序部署到独立容器中时,通常不能通过根(即http://localhost:8080/)使用它,而是在部署WAR文件后命名的专用上下文(例如http://localhost:8080/my-app

答案 1 :(得分:0)

由于java版本,我遇到了这个问题的不同版本。所有配置在pom中都是正确的。

<properties>
    ...    
    <tomcat.version>8.0.39</tomcat.version>
    <java.version>1.8</java.version>
    ...
</properties>

结果是服务器运行的是OpenJDK版本7.启动时tomcat日志中没有错误,但Spring应用程序也没有输出。

将服务器升级到Oracle JDK版本8后,一切都运行良好。

答案 2 :(得分:0)

我遇到了与更新的Tomcat(7.0.82)相同的问题。在此处描述的其他解决方案对我不起作用后,我能够通过实现另一个类ServletInitializer.java来解决问题:

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApp.class);
    }
}

而不是扩展MyApp.java

...
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
    ...
}

有关完整教程,请参阅https://www.youtube.com/watch?v=92ceKwUZoA0

答案 3 :(得分:0)

只需删除<scope>provided</scope>,除非您最终希望将其部署到其他tomcat

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <!--<scope>provided</scope>-->
</dependency>