如何在Spring Boot主方法中获取Repository实例配置SSL开启HTTPS
问题根因
你遇到的报错由两个核心问题导致:
@Autowired无法注入静态成员,Spring容器的依赖注入只会作用于实例对象,不会给静态字段赋值- 你在
SpringApplication.run()执行前就调用Repository,此时Spring上下文尚未初始化,数据源、JPA Repository等所有Bean都还未被创建,必然会抛出空指针
可行解决方案
不用在main方法中提前处理SSL属性配置,改用Spring Boot官方提供的WebServerFactoryCustomizer扩展接口即可,该接口的回调会在嵌入式Web服务器启动前触发,此时Spring上下文已初始化完成,Repository可以正常注入使用,完全满足你从数据库读取配置、不使用properties文件的需求。
步骤1:简化启动类代码
import com.our.Task.configuration.FileStorageProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; @SpringBootApplication @EnableConfigurationProperties({FileStorageProperties.class}) public class OurTaskApplication { public static void main(String[] args) { SpringApplication.run(OurTaskApplication.class, args); } }
步骤2:新增SSL动态配置类
import com.our.Task.entities.ApplicationHttpsSettingsEntity; import com.our.Task.repository.ApplicationHttpsSettingsEntityRepository; import org.springframework.boot.web.server.Ssl; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.stereotype.Component; @Component public class CustomSslConfig implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { private final ApplicationHttpsSettingsEntityRepository httpsSettingsRepository; // Spring 4.3及以上版本单构造函数注入无需加@Autowired注解 public CustomSslConfig(ApplicationHttpsSettingsEntityRepository httpsSettingsRepository) { this.httpsSettingsRepository = httpsSettingsRepository; } @Override public void customize(ConfigurableServletWebServerFactory factory) { ApplicationHttpsSettingsEntity settings = httpsSettingsRepository.getById(44); if (settings.getUseHttps() > 0) { Ssl ssl = new Ssl(); ssl.setKeyStore(settings.getKeyStore()); ssl.setKeyStorePassword(settings.getKeyStorePassword()); ssl.setKeyStoreType(settings.getKeyStoreType()); ssl.setKeyAlias(settings.getKeyAlias()); ssl.setEnabled(true); factory.setSsl(ssl); // 可自定义HTTPS端口,默认是8443 factory.setPort(443); } } }
注意事项
如果你使用的是WebFlux响应式技术栈,只需要把配置类实现的接口泛型从ConfigurableServletWebServerFactory替换为ConfigurableReactiveWebServerFactory即可,其余逻辑完全一致。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

