Grails中使用Fields插件渲染模板时路径异常导致模板未找到的问题咨询
我来帮你理清这个问题的来龙去脉,以及对应的解决办法:
问题场景
你在HotelController里写了这段代码:
def search() { def result = Hotel.list() render(template: "searchTable", model: [hotelList: result], plugin: "fields") }
结果触发了模板未找到的异常:
URI /hotel/search
类 org.grails.web.servlet.mvc.exceptions.ControllerExecutionException
消息 null
原因:无法加载URI为[/hotel/_searchTable]的模板,模板未找到。
你已经确认build.gradle里引入了Fields插件依赖,而且把_searchTable.gsp放到/views/hotel/目录下时,render能正常工作,但按照插件预期,它应该去/templates/_fields/目录查找模板才对。
问题根源
当你在render方法里指定plugin: "fields"时,Grails并没有自动把插件的默认模板目录(/templates/_fields/)作为查找路径,而是依然优先去当前控制器对应的视图目录(/views/hotel/)找模板。这是因为你只传入了模板名称,没有明确指定模板在插件内的完整路径。
解决办法
你只需要修改render方法里的模板路径,明确指向Fields插件的模板目录即可:
render(template: "/fields/searchTable", model: [hotelList: result], plugin: "fields")
同时要确保你的_searchTable.gsp确实放在grails-app/templates/_fields/目录下,这样Grails就能正确定位到插件里的模板了。
另外,也可以检查一下Fields插件的版本是否和你的Grails版本兼容,版本不匹配偶尔也会导致这类模板解析异常。你可以在build.gradle里确认依赖版本,比如:
implementation "org.grails.plugins:fields:5.0.2" // 替换成和你的Grails版本适配的版本号
内容的提问来源于stack exchange,提问作者Geara0

