【问题标题】:Spring Boot app not working when deployed into standalone Tomcat部署到独立 Tomcat 时 Spring Boot 应用程序无法正常工作
【发布时间】:2014-07-17 23:12:58
【问题描述】:

我关注了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上运行这个(如何做简单的rest并在tomcat上运行)
  2. 如何通过注解配置mongo(只是为了获取我的数据库)

注意:默认情况下,它使用运行 spring boot 的测试恶意软件,我可以通过简单的控制器(而不是 @RepositoryRestResource)使其工作,但我希望能够 curl http://localhost:8080 并通过选项获得响应。

【问题讨论】:

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


    【解决方案1】:

    您是否确定您遵循了引导参考文档中的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 引导机制挂钩的类型。参考文档也有 instructions 说明如何使启动应用程序在 Servlet 3.0 之前的 Servlet 容器中工作。

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

    【讨论】:

    • extends SpringBootServletInitializer 丢失。我试图删除这个应用程序类并将东西放在 web.xml 中,但我想让它以这种方式工作,因为它更容易阅读。非常感谢。关于 localhost 上的部署 - 我在“/”上使用“@RequestMapping”,它在没有 /myapp 的情况下在 localhost 上给了我响应,但这是当我使用 web.xml 和“@Controller”时+我通过 spring 工具套装部署它(当我手动运行tomcat时,我当然需要/myapp)再次非常感谢您的回复。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      将服务器升级到 Oracle JDK 8 后,一切正常。

      【讨论】:

      • 知道有用。谢谢你,虽然我迟到了,但我之前在通知中没有看到这个。
      【解决方案4】:

      我在使用更新的 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 2019-11-13
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多