【发布时间】:2020-06-10 20:53:57
【问题描述】:
我正在构建一个 Spring Boot 应用程序,一开始,我需要检查一些系统文件并使用应用程序在那里找到的信息准备一些数据库池。通常,我会将它包含在 @SpringBootApplication 注释类的主要方法中,但是,当我将我的应用程序作为 WAR 文件部署到外部 Tomcat 服务器时,该主类似乎没有运行。我已经检查了你应该在那个主类中拥有什么,我的主应用程序类现在看起来像这样:
package com.companyname.projectname;
import com.companyname.projectname.database.DatabasePoolManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class WebApplication extends SpringBootServletInitializer {
private static final Logger logger = LoggerFactory.getLogger(WebApplication.class);
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(WebApplication.class, args);
DatabasePoolManager dpm = applicationContext.getBean(DatabasePoolManager.class);
dpm.setUpPools();
logger.error("\n\nIS ANYBODY OUT THERE?\n\n");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
logger.error("\n\nIS ANYBODY OUT THERE? (But in the configure method)\n\n");
return builder.sources(WebApplication.class);
}
}
由于extends 和configure 的覆盖,这与我的原始设置不同。
到目前为止,我的 Intellij IDE 仍然可以正常运行,但是一旦移动并部署到 tomcat 服务器,就不会出现任何日志消息。该应用程序仍然有效,但显然缺少一些授予其功能的设置(与数据库的连接)。当我将此应用程序部署为 WAR 文件时,我将如何在应用程序启动时运行一些设置代码?
【问题讨论】:
-
将该设置代码放入
ApplicationRunner或CommandLineRunner中,这将在应用程序启动时执行。这样它就可以在任何一种情况下工作。我还想知道您需要设置什么样的池,以及您是否真的应该以不同的方式进行设置。 -
这正是我所需要的,谢谢。我设置的只是 Hikari 数据库池,在设置过程中,我让我的程序查找本地 TNS 文件和密码服务,然后基于此创建池。您有其他方法可以做到这一点吗?
-
这似乎有点骇人听闻?您如何在应用程序上下文中注册它们?最简单的方法是使
setUpPools方法成为一个init-method 或在启动后从应用程序侦听器调用它。这样它就可以在任何情况下工作。 -
啊,好吧。所以类似于本文档第 2.3 节中的内容:baeldung.com/running-setup-logic-on-startup-in-spring
-
类似的东西是的。另外,如果您知道有多少个游泳池,为什么不直接把它们做成豆子呢?或者甚至可以为它创建一个
BeanDefinitionRegistryPostProcessor,这样您就可以添加 bean 定义,这些定义将由 Spring 处理和管理。在 Spring 之外创建池的事实再次让人感觉很笨拙。
标签: java spring spring-boot tomcat tomcat9