Spring Boot Maven Web API:解决Swagger自动打开重复弹窗问题
解决Spring Boot热重载重复打开Swagger页面的方案
核心思路
VS Code热重载时Spring Boot会重启应用上下文,导致原有的浏览器启动代码重复执行。我们可以通过区分首次启动和热重载重启,只在首次启动时打开Swagger页面,避免重复弹窗。
方案一:利用Spring Boot DevTools的重启标记
Spring Boot DevTools在热重载重启时会自动设置系统属性spring.devtools.restart.active为true,首次启动时该属性不存在(默认false)。基于此判断是否执行浏览器启动逻辑:
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.awt.Desktop; import java.net.URI; @Component public class BrowserLauncherConfig implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { // 仅在非热重载的首次启动时打开浏览器 boolean isRestart = Boolean.getBoolean("spring.devtools.restart.active"); if (!isRestart && Desktop.isDesktopSupported()) { Desktop.getDesktop().browse(new URI("http://localhost:8080/swagger-ui/index.html")); } } }
确保你的Maven依赖中已引入devtools:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
方案二:基于应用启动事件的单例控制(兼容无devtools场景)
如果未使用devtools,可以通过静态标记记录是否已执行过浏览器启动逻辑。注意:该方案仅适用于无devtools的热重载场景,若使用devtools,热重载会重新加载类导致静态标记重置,此时方案一更可靠:
import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import java.awt.Desktop; import java.net.URI; @Component public class BrowserLauncherConfig { private static boolean hasLaunched = false; @EventListener(org.springframework.boot.context.event.ApplicationStartedEvent.class) public void launchSwagger() throws Exception { if (!hasLaunched && Desktop.isDesktopSupported()) { Desktop.getDesktop().browse(new URI("http://localhost:8080/swagger-ui/index.html")); hasLaunched = true; } } }
说明
直接检查浏览器是否已打开指定Swagger页面的方案需要依赖跨平台的系统命令(如Windows的tasklist、Mac的ps),实现复杂且兼容性差,上述基于Spring自身标记的方案更简洁可靠,无需依赖本地存储或配置文件。
内容的提问来源于stack exchange,提问作者CrazyEight
相关产品推荐
相关产品推荐

