问题描述
请求是在spring boot项目运行时修改mongodb连接的密码。例如,假设在使用密码“xyz”启动应用程序时建立了 mongodb 连接。我想在运行时修改密码,比如点击 api。 到目前为止,我已尝试使用以下解决方案来解决此问题:
- 在运行时替换 mongoTemplate bean:尝试在运行时使用新密码创建新的 mongoTemplate Bean,并使用以下 link 中给出的方法在上下文中替换它。这种方法的问题是 bean 只刷新一次。理想情况下,每次调用更新密码的 api 时它都应该工作。
- 在 mongoCredentials 中更新密码: 一种显而易见的方法是直接在 mongoCredentials 中更新密码,因为 mongoTemplate 使用 mongoCredential 类来存储凭据信息。但问题在于 MongoCredentials 类中的密码字段是 'final static' 所以即使使用反射我们也无法更新它。尽管有一些技巧可以更新最终静态字段,但我正在寻找更可接受的解决方案。
解决方法
Spring Cloud 项目中有 @RefreshScope
正是为了您的目的。以下是 Spring 关于其工作原理的文档:https://cloud.spring.io/spring-cloud-static/spring-cloud.html#_refresh_scope。
因此,您需要做的就是更新 Environment
并在需要刷新上下文时调用 org.springframework.cloud.context.scope.refresh.RefreshScope#refresh
或 org.springframework.cloud.context.scope.refresh.RefreshScope#refreshAll
。