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

Grails 2.5.6:如何用XML/DSL创建请求作用域Bean及工厂Bean

Grails 2.5.6 注解转XML/DSL配置方案

一、XML配置方式

在grails-app/conf/spring/resources.xml中添加以下配置:

1. 配置请求作用域的MelHeaders Bean

<!-- 请求作用域的MelHeaders,构造注入HttpServletRequest -->
<bean id="melHeaders" class="com.yourpackage.MelHeaders" scope="request">
    <constructor-arg type="javax.servlet.http.HttpServletRequest"/>
    <!-- 启用代理,确保跨作用域引用正常工作 -->
    <aop:scoped-proxy proxy-target-class="true"/>
</bean>

2. 配置工厂Bean(Function<HttpServletRequest, MelHeaders>)

XML无法直接定义Lambda,需先封装一个工厂类:

// 自定义工厂类,实现Function接口
public class HeaderHandlerFactory implements Function<HttpServletRequest, MelHeaders> {
    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public MelHeaders apply(HttpServletRequest request) {
        return applicationContext.getBean(MelHeaders.class, request);
    }
}

然后在XML中配置该工厂类的Bean:

<bean id="headerHandlerFactory" class="com.yourpackage.HeaderHandlerFactory"/>

二、Grails DSL配置方式(resources.groovy)

在grails-app/conf/spring/resources.groovy中直接配置,无需额外类:

import javax.servlet.http.HttpServletRequest
import org.springframework.web.context.WebApplicationContext

// 配置请求作用域的MelHeaders,构造注入request
melHeaders(MelHeaders, ref('request')) {
    scope = WebApplicationContext.SCOPE_REQUEST
    scopedProxy = true // 启用代理解决跨作用域引用问题
}

// 配置工厂Bean,直接用Lambda实现Function接口
headerHandlerFactory = { HttpServletRequest request ->
    applicationContext.getBean(MelHeaders, request)
} as Function<HttpServletRequest, MelHeaders>

注意事项

  • 替换代码中的com.yourpackage为实际的包路径
  • 确保MelHeaders类存在接收HttpServletRequest的构造函数
  • 请求作用域Bean必须启用scopedProxy,否则单例Bean引用时会抛出作用域不匹配异常
  • Grails 2.5.6基于Spring 4.1.x,上述配置完全兼容该版本

内容的提问来源于stack exchange,提问作者SebasRios94

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:56:03