我有一个控制器方法,它接受一个名为“search”的字符串参数:
def test(String search) {
log.info("search: ${search}")
render("testing ${search}")
}
这在 Grails 3.3.9 中工作正常,但在 6.0.0 中,当我的 URL 包含
?search=mystring
无法将类“java.lang.String”的对象“mystring”转换为类“com.whatever.project.SavedSearch”
我确实有一个名为 SavedSearch 的域对象。看起来 Grails 正在尝试将名为“search”的参数转换为这种类型的对象。
当我将参数名称更改为其他任何名称(例如“searchString”)时,它工作正常。
以下是使用最小的 Grails 6 项目进行重现的步骤:
git clone https://github.com/landydan/so-grails-6-poc-search-query.git
git checkout revised
grails clean
grails run-app
Navigate in the browser to localhost:8080.
Click on the link shown in the landing page.
You should see the class cast exception.
请注意,此错误似乎取决于同一控制器中引用 SavedSearch 对象的以下方法的存在:
def something() {
Long searchId = params.id as Long
// below is the line that needs to be present
SavedSearch search = SavedSearch.read(searchId)
render("placeholder")
}
迁移后我也遇到了同样的问题。如果您有另一种方法,可以将值分配给与方法中的变量同名的变量,例如:
def test(String search) {
log.info("search: ${search}")
render("testing ${search}")
}
def another() {
SavedSearch search = SavedSearch.read(searchId)
}
Grails 5/6 将尝试使用方法声明中的任何“搜索”作为 SavedSearch 类型。对于域和命令对象会发生这种情况。
这显然是 Grails 中的一个错误,但有一个简单的解决方法 - 只需以不同的方式命名变量,例如:
SavedSearch savedSearch = SavedSearch.read(searchId)