如何禁用 TomcatServletWebServerFactory 的 SpringBoot 自动配置以便自定义 spring-starter 提供它?

     2023-02-27     187

关键词:

【中文标题】如何禁用 TomcatServletWebServerFactory 的 SpringBoot 自动配置以便自定义 spring-starter 提供它?【英文标题】:How to disable SpringBoot autoconfiguration for TomcatServletWebServerFactory in order for a custom spring-starter to provide it? 【发布时间】:2020-03-08 07:46:49 【问题描述】:

所以我正在编写自己的 SpringBootStarter,它应该能够在 SpringBoot 应用程序的嵌入式 tomcat 中启用 JNDI 查找。

我的示例 SpringBoot 应用程序依赖于我的自定义 SpringBootStarter,而后者又依赖于 spring-boot-starter-web。如果我在示例 SpringBoot 应用程序中创建如下配置类,则一切正常:

@Configuration
public class SampleSpringBootAppConfig 


@Bean
public TomcatServletWebServerFactory tomcatFactory() 
    return new TomcatServletWebServerFactory() 
        @Override
        protected TomcatWebServer getTomcatWebServer(org.apache.catalina.startup.Tomcat tomcat) 
            System.out.println("CONFIGURING CUSTOM TOMCAT WEB SERVER FACTORY ");
            tomcat.enableNaming();
            return super.getTomcatWebServer(tomcat);
        

        @Override
        protected void postProcessContext(Context context) 



            ContextResource resource = new ContextResource();
            resource.setName("myDataSource");
            resource.setType(DataSource.class.getName());
            resource.setProperty("driverClassName", "org.postgresql.Driver");

            resource.setProperty("url", "jdbc:postgresql://localhost:5432/postgres");
            resource.setProperty("username", "postgres");
            resource.setProperty("password", "postgres");

            context.getNamingResources()
                    .addResource(resource);

        
    ;

因为 SpringBoot 找到了一个自定义 Bean,所以不会有一个自动配置的默认 Bean/它被覆盖并且 JNDI 已成功启用。

但是,一旦我将此 Bean 配置提取到我的自定义 SpringBoot Starter 的自动配置模块中,尝试启动示例 SpringBoot 应用程序时会引发以下异常:

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to multiple ServletWebServerFactory beans : tomcatServletWebServerFactory,tomcatFactory

我认为这是由于 SpringBoot 没有找到自定义的 Bean,因此创建了一个自动配置的默认 Bean,它也不会被覆盖。所以现在会有两个 ServletWebServerFactory bean,一个是默认的,一个来自我的自动配置模块。

到目前为止我尝试了什么(无济于事):

使用 @Primary 注释我的自定义 Bean 将 spring.main.allow-bean-definition-overriding 设置为 true

有没有办法让 SpringBoot 不初始化自动配置的默认 bean,或者任何其他可能的解决方案?

【问题讨论】:

【参考方案1】:

试试这个 @AutoConfigureBefore(ServletWebServerFactoryAutoConfiguration.class)

【讨论】:

【参考方案2】:

我能够通过排除负责的 AutoConfiguration 类自己解决这个问题:

@SpringBootApplication ( exclude = ServletWebServerFactoryAutoConfiguration.class)

【讨论】:

如何禁用 RecyclerView 滚动?

】如何禁用RecyclerView滚动?【英文标题】:HowtodisableRecyclerViewscrolling?【发布时间】:2015-08-1209:49:32【问题描述】:我无法在RecyclerView中禁用滚动。我试过打电话给rv.setEnabled(false),但我仍然可以滚动。如何禁用滚动?【问题讨论... 查看详情

如何禁用 UISlider?

】如何禁用UISlider?【英文标题】:HowtodisableUISlider?【发布时间】:2016-01-0521:23:49【问题描述】:我已经看到了有关此问题的答案,但没有实际代码解释如何执行此操作,我是swift新手,对如何执行这个简单任务感到非常困惑。... 查看详情

表单提交后如何禁用以前禁用的选择

】表单提交后如何禁用以前禁用的选择【英文标题】:Howtodisablepreviouslydisabledselectsafterformsubmit【发布时间】:2021-10-0807:25:18【问题描述】:我有一个包含多个选择的表单。其中一些被禁用,因为我不希望用户修改这些值。但由... 查看详情

如何禁用 UIButton 和禁用 touchEvent 响应程序?

】如何禁用UIButton和禁用touchEvent响应程序?【英文标题】:HowtodisableUIButtonanddisabletouchEventresponder?【发布时间】:2012-08-0708:26:18【问题描述】:我有IBOutletUIButton。启用时它不会响应touchesBegan:withEvent:。但是当我设置[buttonsetEnabled:N... 查看详情

如何根据条件禁用 TestNG 测试

】如何根据条件禁用TestNG测试【英文标题】:HowtodisableTestNGtestbasedonacondition【发布时间】:2011-04-2603:17:10【问题描述】:目前有没有办法根据条件禁用TestNG测试我知道您目前可以在TestNG中禁用测试:@Test(enabled=false,group="blah")public... 查看详情

如何启用禁用的按钮

】如何启用禁用的按钮【英文标题】:Howtoenablethedisabledbutton【发布时间】:2012-09-2407:37:17【问题描述】:我有一个工具按钮,我想在单击它时禁用它(如果它已启用)并在单击它时启用它(它已被禁用)。问题是当点击它时,... 查看详情

如何在本机反应中禁用键盘

】如何在本机反应中禁用键盘【英文标题】:Howtodisablekeyboardinreactnative【发布时间】:2018-12-1015:05:26【问题描述】:我创建了一个屏幕键盘组件,我想禁用平台的键盘,我该如何禁用它?<TextInputsecureTextEntryref="Pin"selectionColor="#... 查看详情

如何暂时禁用滚动?

】如何暂时禁用滚动?【英文标题】:Howtodisablescrollingtemporarily?【发布时间】:2011-06-1318:58:55【问题描述】:我正在使用scrollTojQuery插件,想知道是否可以通过Javascript暂时禁用窗口元素的滚动?我想禁用滚动的原因是,当您在scr... 查看详情

如何禁用主页键

】如何禁用主页键【英文标题】:Howtodisablethehomekey【发布时间】:2011-04-2308:51:15【问题描述】:我想锁定屏幕。我想禁用主页键,只使用返回键。我该如何做到这一点?【问题讨论】:看这里,似乎你需要实现主屏幕更换的快... 查看详情

如何禁用诊断工具?

】如何禁用诊断工具?【英文标题】:HowtodisableDiagnosticTools?【发布时间】:2015-11-0112:05:46【问题描述】:在VisualStudio2015中调试C#应用程序时,诊断工具会自动启动。我在SelectTools中取消选中了两个复选框,但它似乎并没有完全禁... 查看详情

如何禁用多个按钮?

】如何禁用多个按钮?【英文标题】:HowcanIdisablemultiplebuttons?【发布时间】:2010-08-1520:12:58【问题描述】:我的视图上有2个按钮,我想在单击另一个按钮时禁用第一个按钮,并在再次单击该按钮时禁用第二个按钮。我已尝试使... 查看详情

如何禁用 Crashlytics Answers?

】如何禁用CrashlyticsAnswers?【英文标题】:HowtodisableCrashlyticsAnswers?【发布时间】:2015-08-1211:34:22【问题描述】:禁用Crashlytics错误报告相对straightforward.。我还想禁用调试版本的答案。不过,newCrashlytics.Builder().answers(null);不起作... 查看详情

如何禁用事件?

】如何禁用事件?【英文标题】:HowtodisableEvents?【发布时间】:2013-01-0303:18:16【问题描述】:我创建btn1_MouseDown事件。privatevoidbtn1_MouseDown(objectsender,MouseEventArgse)btn1.BackgroundImage=Properties.Resources.click;我想在检查时禁用此RadioButton后... 查看详情

如何禁用导航栏项目?

】如何禁用导航栏项目?【英文标题】:HowtodisableaUINavigationBarItem?【发布时间】:2011-01-1503:55:10【问题描述】:我正在尝试禁用添加到导航控制器栏的按钮。这是我添加它的方法:UIBarButtonItem*addButton=[[UIBarButtonItemalloc]initWithTitle:... 查看详情

如何禁用/删除终端脚本?

】如何禁用/删除终端脚本?【英文标题】:Howtodisable/removeTerminalscript?【发布时间】:2011-10-1301:32:06【问题描述】:前段时间我写了一个终端脚本,每次启动终端时都会执行cdDesktop。随着Lion的发布,这不再是必要的,因为Terminal... 查看详情

你如何禁用 CBitmapButton?

】你如何禁用CBitmapButton?【英文标题】:HowdoyoudisableCBitmapButton?【发布时间】:2009-03-1217:57:23【问题描述】:如何禁用CBitmapButton?我尝试使用m_bitmapbutton.EnableWindow(false);但它不起作用。它仍然会触发一个事件。如果事件B正在执... 查看详情

如何禁用登录clickhouse?

】如何禁用登录clickhouse?【英文标题】:howtodisablelogginginclickhouse?【发布时间】:2021-07-2010:28:45【问题描述】:我想禁用登录clickhouse。我尝试在config.xml中禁用部分query_log和query_thread_log,但这对我没有帮助。我尝试运行sql查询:... 查看详情

如何禁用 JWT 令牌

】如何禁用JWT令牌【英文标题】:HowtoDisableaJWTToken【发布时间】:2020-04-1709:56:57【问题描述】:我想在用户从应用程序注销时禁用生成的JWT令牌,这需要在后端代码中完成。如何使用身份验证服务器(SpringBoot)禁用JSONWeb令牌(JWT)【... 查看详情