You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:22:34