尝试使用 Grails 2.3.7 查询 MongoDB 域 class 时出现 IllegalStateException
IllegalStateException when trying to query a MongoDB domain class using Grails 2.3.7
我正在处理一个使用 Grails 2.3.7(与 Maven)和 Java 7 的遗留项目,我必须添加一个到 MongoDB 数据库的连接,同时保持现有的 Hibernate一个。
我已将以下内容添加到我的 pom.xml 文件中:
<dependency>
<groupId>org.grails.plugins</groupId>
<artifactId>mongodb</artifactId>
<type>zip</type>
<version>3.0.2</version>
</dependency>
并将此添加到 BuildConfig.groovy 文件:
plugins {
compile ':mongodb:3.0.2'
compile 'org.grails.plugins:mongodb:3.0.2'
}
(我已经尝试过使用和不使用 compile 'org.grails.plugins:mongodb:3.0.2' 行)
在 DataSource.groovy 文件中我配置了数据库连接如下:
grails {
mongodb {
host = "xxx.xxx.xxx.xxx"
port = "27017"
databaseName = "db"
username = "user"
password = "pass"
}
}
并且连接本身似乎在工作,因为如果我更改其中的任何值,Grails 应用程序甚至不会启动。
然后我创建了一个简单的域 class, Thingy.groovy:
class Thingy {
String identifier
String description
static mapWith = "mongo"
static constraints = {
}
}
现在,当我启动应用程序时,对 class 方法的任何调用都会引发 IllegalStateException:"Method on class [Thingy] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly."
。但是,如果我在同一个地方调用使用其他数据源的旧域 classes 的任何方法,它们的工作就像一个魅力。
此外,在启动服务器时我得到另一个异常,我猜这可能是相关的,但我也不确定如何处理它:ERROR - Error configuring dynamic methods for plugin [mongodb:3.0.2]: org/grails/datastore/mapping/query/api/BuildableCriteria
java.lang.NoClassDefFoundError: org/grails/datastore/mapping/query/api/BuildableCriteria
.
我也尝试过使用 MongoDB 插件 3.0.3,但结果相同。
这个答案给了我一个线索。我还必须手动更新 grails-datastore-core
和 grails-datastore-gorm
版本:
<dependency>
<groupId>org.grails</groupId>
<artifactId>grails-datastore-gorm</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.grails</groupId>
<artifactId>grails-datastore-core</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
如果它对其他人有帮助,我通过查看 mongodb 插件 (https://repo.grails.org/grails/plugins/org/grails/plugins/mongodb/3.0.3/mongodb-3.0.3.pom)[=16] 的 POM 文件中的 <dependencies>
找到了要使用的版本=]
我正在处理一个使用 Grails 2.3.7(与 Maven)和 Java 7 的遗留项目,我必须添加一个到 MongoDB 数据库的连接,同时保持现有的 Hibernate一个。
我已将以下内容添加到我的 pom.xml 文件中:
<dependency>
<groupId>org.grails.plugins</groupId>
<artifactId>mongodb</artifactId>
<type>zip</type>
<version>3.0.2</version>
</dependency>
并将此添加到 BuildConfig.groovy 文件:
plugins {
compile ':mongodb:3.0.2'
compile 'org.grails.plugins:mongodb:3.0.2'
}
(我已经尝试过使用和不使用 compile 'org.grails.plugins:mongodb:3.0.2' 行)
在 DataSource.groovy 文件中我配置了数据库连接如下:
grails {
mongodb {
host = "xxx.xxx.xxx.xxx"
port = "27017"
databaseName = "db"
username = "user"
password = "pass"
}
}
并且连接本身似乎在工作,因为如果我更改其中的任何值,Grails 应用程序甚至不会启动。
然后我创建了一个简单的域 class, Thingy.groovy:
class Thingy {
String identifier
String description
static mapWith = "mongo"
static constraints = {
}
}
现在,当我启动应用程序时,对 class 方法的任何调用都会引发 IllegalStateException:"Method on class [Thingy] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly."
。但是,如果我在同一个地方调用使用其他数据源的旧域 classes 的任何方法,它们的工作就像一个魅力。
此外,在启动服务器时我得到另一个异常,我猜这可能是相关的,但我也不确定如何处理它:ERROR - Error configuring dynamic methods for plugin [mongodb:3.0.2]: org/grails/datastore/mapping/query/api/BuildableCriteria
java.lang.NoClassDefFoundError: org/grails/datastore/mapping/query/api/BuildableCriteria
.
我也尝试过使用 MongoDB 插件 3.0.3,但结果相同。
这个答案grails-datastore-core
和 grails-datastore-gorm
版本:
<dependency>
<groupId>org.grails</groupId>
<artifactId>grails-datastore-gorm</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.grails</groupId>
<artifactId>grails-datastore-core</artifactId>
<version>3.1.4.RELEASE</version>
</dependency>
如果它对其他人有帮助,我通过查看 mongodb 插件 (https://repo.grails.org/grails/plugins/org/grails/plugins/mongodb/3.0.3/mongodb-3.0.3.pom)[=16] 的 POM 文件中的 <dependencies>
找到了要使用的版本=]