为什么 Grails (6.0.0) 尝试将字符串 URL 参数转换为域对象? (似乎与域名部分匹配有关。)

问题描述 投票:0回答:1

我有一个控制器方法,它接受一个名为“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")
    }
grails grails-domain-class grails-controller
1个回答
0
投票

迁移后我也遇到了同样的问题。如果您有另一种方法,可以将值分配给与方法中的变量同名的变量,例如:

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)

© www.soinside.com 2019 - 2024. All rights reserved.