RestAssured Groovy GPath findAll单匹配时如何强制返回单元素List
问题原因
该现象不是Groovy findAll 语法的问题,findAll 本身执行后永远返回集合类,是RestAssured的XmlPath默认开启了「单元素集合自动拆包」的特性:当匹配结果数量为1时,会自动把集合转成单个元素对象,才会导致类型转换异常。
解决方案
方案1:直接用getList方法替代get(最推荐)
XmlPath自带专门返回集合的getList方法,可以直接指定元素类型,完全规避自动拆包问题:
String tagName = "bar"; List<String> bars = xmlPath.getList(String.format("**.findAll {it.name() == '%s' }", tagName), String.class);
方案2:修改Groovy表达式强制返回列表
如果必须使用get方法,可以在表达式外层做强制集合包裹,两种写法都可以:
- 主动调用
toList()转换:"**.findAll {it.name() == '%s' }.toList()" - 用中括号包裹后压平:
"[**.findAll {it.name() == '%s' }].flatten()"
方案3:全局关闭XmlPath的自动拆包特性
初始化XmlPath时修改配置,永久关闭单元素集合拆包逻辑,后续所有查询都会默认返回集合:
XmlPathConfig config = new XmlPathConfig(); config.setUnwrapSingleElementCollections(false); XmlPath xmlPath = new XmlPath(你的XML内容字符串).using(config);
内容的提问来源于stack exchange,提问作者MiklosBalazsi
相关产品推荐
相关产品推荐

