由于创建 mongoTemplate bean 时出错,Spring boot + mongo Heroku 部署失败

时间:2021-01-31 04:41:17

标签: mongodb spring-boot heroku production

我有一个 jhipster 生成的 Spring Boot + mongo 项目,该项目在本地部署成功,但使用 ObjectRocket 附加组件部署到 Heroku 失败并出现此错误:

 % pip install --upgrade pip
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 11, in <module>
    load_entry_point('pip==21.0.1', 'console_scripts', 'pip')()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources/__init__.py", line 2843, in load_entry_point
    return ep.load()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources/__init__.py", line 2434, in load
    return self.resolve()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources/__init__.py", line 2440, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/Library/Python/2.7/site-packages/pip-21.0.1-py2.7.egg/pip/_internal/cli/main.py", line 60
    sys.stderr.write(f"ERROR: {exc}")
                                   ^
SyntaxError: invalid syntax

我相信我的 [org.springframework.data.mongodb.core.MongoTemplate]: Factory method 'mongoTemplate' threw exception; nested exception is org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate$1@4339e0de. Client view of cluster state is {type=REPLICA_SET, servers=[]; nested exception is com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches com.mongodb.client.internal.MongoClientDelegate$1@4339e0de. Client view of cluster state is {type=REPLICA_SET, servers=[] 变量的配置变量是正确的,因为在 shell 中,我已经成功地使用来自我的配置变量的相同连接字符串连接到我的 mongo 数据库。此连接字符串存储在 MONGODB_URI 中,格式为 MONGODB_URI。这也意味着我已经在 ObjectRocket 端设置了我的 mongodb dbname、用户和密码。

我的 procfile 有一行 mongodb://<USERNAME>:<PASSWORD@<host1>:<port1>,<host2>:<port2>,<host3>:<port3>/<DATABASE_NAME>?replicaSet=<replicaSetID> 引用 --spring.data.mongodb.database=$(echo "$MONGODB_URI" | sed "s/^.*:[0-9]*\///g")。我的 MONGODB_URI 配置文件包含以下条目:

application-prod.yml

但是我没有成功部署,因为我的 mongo 数据库实例连接失败。任何帮助将不胜感激。

在此 pastebin 粘贴中的堆栈跟踪中有更多上下文的错误:https://pastebin.com/wNd3TxUL

1 个答案:

答案 0 :(得分:1)

我找到了解决方案,并希望发布以防其他人遇到此问题并被说服进入配置文件和云基础架构的无用兔子洞。问题特别是由于使用 Mongo Atlas DB 和使用 Mongobee 执行初始数据库配置步骤的 Spring Bean,例如设置数据库名称、模板和运行一些变更集以保留用户权限和少数初始用户。最重要的是,这个初始数据库配置试图修改 system.indexes,即 MongoDB Atlas deprecated starting in version 3.0。来自 MongoDB Atlas 文档:

<块引用> 从 MongoDB 4.2 开始,.system.indexes 已被删除(从 3.0 开始不推荐访问集合)。要列出索引 [原文如此],请改用 listIndexes 命令。

这使得这个问题与这些帖子中遇到的问题相同:

MongoDB Atlas deprecates access to system.indexes Forbidden action on system.indexes,由同一作者 Yuriy Yunikov 回答,他非常详细地回答了上述问题 Jhipster and mongobee discussion

应该注意的是,JHipster 的最新版本(例如,至少可以追溯到 release 7 on)已经放弃了 Mongobee 而支持 Mongock