如何在GrailsParameterMap中优雅地携带数组进行重定向?
优雅解决GrailsParameterMap重定向携带数组的问题
这个问题我之前在项目里踩过坑!直接把包含数组的params传入redirect时,Grails不会自动处理数组类型,而是直接调用数组的toString()方法,就会出现你看到的[Ljava.lang.String;@596a40f1这种内存地址字符串。下面给你几个实用且优雅的解决方式:
方法1:手动将数组转为List后传递
Grails对List类型的参数处理非常友好,会自动把List拆分为多个同名的URL参数(比如?myArray=val1&myArray=val2)。你可以把数组参数转为List后再构建重定向参数:
// 复制原params,避免修改原对象 def redirectParams = new LinkedHashMap(params) // 假设你的数组参数名为myArray,转为List redirectParams.myArray = params.list('myArray') // 执行重定向 redirect(action: "XXX", params: redirectParams)
如果是你自己生成的数组(不是从请求参数里获取的),直接用List代替数组即可,比如用['apple', 'banana', 'cherry']而不是new String[]{'apple', 'banana', 'cherry'},这样Grails能直接正确处理。
方法2:修正原params对象的数组参数
如果你不想创建新的参数Map,可以直接修改原params里的数组参数,将其转为List后再重定向:
// 取出数组参数并转为List def targetArray = params.myArray as List // 移除原数组参数 params.remove('myArray') // 存入转为List后的参数 params.put('myArray', targetArray) // 执行重定向 redirect(action: "XXX", params: params)
方法3:用Flash Scope传递(适合非URL可见的场景)
如果数组不需要出现在URL中,或者数据比较敏感/体积较大,可以用Grails的Flash Scope来传递,它是一次性的会话存储,不会暴露在URL里:
// 将数组存入Flash flash.targetArray = params.list('myArray') // 执行重定向 redirect(action: "XXX")
然后在目标XXX action中,直接从flash获取:
def myArray = flash.targetArray
为什么会出现奇怪的字符串?
简单来说,Java数组的默认toString()方法返回的是[类型名;@内存地址格式的字符串,Grails在处理params中的数组时,没有自动将其拆分为多个请求参数,而是直接把这个字符串作为参数值传递,所以就出现了你看到的异常结果。
内容的提问来源于stack exchange,提问作者patrycze
相关产品推荐
相关产品推荐

