Grails插件升级:使用doWithSpring替代doWithWebDescriptor替换已定义的Servlet Filters
将Grails插件从2.x升级到4.x:过滤器替换方案指南
我来帮你梳理下如何用Grails 4.x的FilterRegistrationBean复现旧插件的功能,以及相关的过滤器状态说明:
一、复现旧代码功能的正确配置
旧代码的核心是替换Grails默认的sitemesh和urlMapping过滤器的实现类,同时根据Servlet版本添加异步支持配置。但Grails 4.x会自动注册这两个默认过滤器,直接注册自定义过滤器会导致重复执行,需要先禁用默认组件,再注册自己的实现:
import org.springframework.core.Ordered Closure doWithSpring() { { -> boolean supportsAsync = grailsApplication.metadata.getServletVersion() >= "3.0" // 第一步:禁用Grails默认的sitemesh和urlMapping过滤器 // 方式1:全局禁用所有默认过滤器(简单直接) grailsApplication.config.grails.web.disable.default.filters = true // 方式2:精准禁用单个过滤器(如果需要保留其他默认过滤器) // sitemeshFilter(enabled: false) // 默认sitemesh过滤器的bean名称是sitemeshFilter // urlMappingsFilter(enabled: false) // 默认urlMapping过滤器的bean名称是urlMappingsFilter // 第二步:注册自定义的sitemesh替代过滤器 pageFilter(FilterRegistrationBean) { name = "sitemesh" // 和原过滤器同名,确保匹配原有逻辑的上下文 filter = bean(org.zkoss.zk.grails.web.ZKGrailsPageFilter) urlPatterns = ["/*"] // 设置优先级,和原sitemesh过滤器保持一致(原过滤器是极高优先级) order = Ordered.HIGHEST_PRECEDENCE + 1 asyncSupported = supportsAsync } // 第三步:注册自定义的urlMapping替代过滤器 urlMappingFilter(FilterRegistrationBean) { name = "urlMapping" filter = bean(org.zkoss.zk.grails.web.ZULUrlMappingsFilter) urlPatterns = ["/*"] // 原urlMapping过滤器在sitemesh之后执行,所以优先级稍低 order = Ordered.HIGHEST_PRECEDENCE + 2 asyncSupported = supportsAsync } } }
关键细节说明:
- 禁用默认过滤器:旧代码是直接替换web.xml中原过滤器的实现类,而Grails 4.x通过自动配置注册默认过滤器,必须先禁用这些默认bean,否则会出现两个功能冲突的过滤器。
- 优先级调整:原web.xml中这两个过滤器是靠前执行的,通过
order属性确保自定义过滤器的执行顺序和原逻辑一致,避免出现请求处理顺序错误。 - 异步支持:和旧代码逻辑完全对齐,根据Servlet版本设置
asyncSupported属性,对应原代码中的<async-supported>节点。
二、关于Grails中这两个过滤器的状态
- Sitemesh过滤器:Grails 4.x仍然保留对Sitemesh的支持,但官方更推荐使用GSP原生的Layouts功能或者现代模板引擎。不过如果你是为了适配ZK框架的页面渲染,替换这个过滤器是合理的,没有被完全弃用。
- UrlMapping过滤器:
UrlMappingsFilter是Grails 4.x的核心组件,负责URL路由解析。官方没有弃用它,不过提供了基于Spring MVC的路由扩展方案。你的插件替换它来适配ZK的ZUL文件路由是可行的,只要确保自定义过滤器的逻辑兼容原组件的核心功能(比如请求转发、路由匹配)。
三、额外注意事项
- 测试验证:升级后一定要测试过滤器的执行顺序、ZK页面渲染、URL路由是否正常,以及异步请求的支持(如果你的环境Servlet版本>=3.0)。
- 依赖兼容:确保ZK相关的Grails依赖在Grails 4.x环境下兼容,可能需要升级ZK的版本来避免类冲突。
- 替代方案:如果ZK社区已经有适配Grails 4.x的官方插件,优先使用官方插件,避免自己维护过滤器替换逻辑。
内容的提问来源于stack exchange,提问作者Maicon Mauricio
相关产品推荐
相关产品推荐

