Groovy调用mapFilesInDirectory方法报MissingMethodException错误求助
老哥,我帮你揪出这个错误的根源了!你碰到的groovy.lang.MissingMethodException,核心问题出在路径转换的写法上——你用as Path强制把字符串转成Path对象的操作,在Groovy里并没有真正生成合法的Path实例,导致后续传给mapFilesInDirectory的其实还是个字符串,而Files.find需要的是正经的Path对象,这才触发了“String没有getFileSystem()方法”的报错。
错误代码的问题点
你这里的路径转换写法是坑所在:
Path directoryPath = resourcePath+directoryName as Path
Groovy的as转换符没办法正确把字符串转换成Path类型,最终directoryPath本质还是String。当这个假的“Path”传入mapFilesInDirectory后,Files.find尝试调用它的getFileSystem()方法时,自然就报错了。
修正步骤
1. 正确构建Path对象
改用Java NIO标准的工具类来创建Path,这才是正确的姿势:
// Java 8及以上都能用的写法 Path directoryPath = Paths.get(resourcePath, directoryName) // 如果你用的是Java 11+,更推荐这种简洁写法 Path directoryPath = Path.of(resourcePath, directoryName)
Paths.get()或者Path.of()会自动处理不同操作系统的路径分隔符,还能保证生成的是合法的Path实例。
2. 完整修正后的代码
修正后的importContentFromDirectory方法
def static importContentFromDirectory(String directoryName, String resourcePath, String importConfigurationFile = null) { // 替换错误的类型转换,用标准方式构建Path Path directoryPath = Paths.get(resourcePath, directoryName) Map<String, String> map = mapFilesInDirectory(directoryPath) importContentWithSeveralFiles(directoryName, map, importConfigurationFile) }
给mapFilesInDirectory加个小优化
另外提个小细节:你用path.endsWith(".xml")来判断XML文件,这个方法匹配的是路径的最后一个元素,比如test.xml没问题,但如果文件名是test.xml.bak就不会匹配。不过更稳妥的写法是转成字符串后判断后缀(还能兼容大小写不同的XML后缀):
static Map<String, String> mapFilesInDirectory(Path dir) throws IOException { return Files.find(dir, 0, { path, attrs -> attrs.isRegularFile() && path.toString().toLowerCase().endsWith(".xml") }) .collect(Collectors.toMap( { path -> path.getFileName().toString() }, // 明确转成String作为key { path -> ResourceUtils.getResourceAsString(path) }, (oldVal, newVal) -> newVal // 可选:如果有重名文件,保留新的那个 )) }
我还加了个重名文件的合并逻辑,要是目录下有同名XML(虽然你现在搜索深度是0,不会有子目录的文件,但以防万一),Collectors.toMap不会报错。
额外提醒
- 确保
resourcePath和directoryName组合起来是合法的目录路径,Paths.get()会自动处理路径分隔符的问题,不用自己拼接斜杠。 - 如果需要递归搜索子目录里的XML文件,把
Files.find的第二个参数从0改成Integer.MAX_VALUE就行。
内容的提问来源于stack exchange,提问作者B. Bailey

