我正在我的一个Grails项目中使用Groovy Spreadsheet Builder将某些数据导出为Excel文件。
在我创建可运行的jar(使用gradle assemble
)并使用它之前,一切工作都很好。
我在这样的服务中使用构建器:
class ExcelService {
...
void export(OutputStream outputStream) {
...
PoiSpreadsheetBuilder.create(outputStream).build {
apply ExcelStylesheet
...
}
}
...
}
当我尝试使用生成的jar从应用开始导出数据时,我将获得以下MissingMethodException
:
groovy.lang.MissingMethodException: No signature of method: my.package.ExcelService.apply() is applicable for argument types: (java.lang.Class)
SpreadsheetBuilder的(Java)接口如下:
public interface SpreadsheetBuilder {
void build(@DelegatesTo(strategy = Closure.DELEGATE_FIRST, value = WorkbookDefinition.class) @ClosureParams(value = FromString.class, options = "builders.dsl.spreadsheet.builder.api.WorkbookDefinition") Configurer<WorkbookDefinition> workbookDefinition);
}
在调试代码和jar的执行过程时,我发现逐步浏览invokeMethod()
中的ClosureMetaClass
时会有所不同。
在工作版本中调用closure.getResolveStrategy();
时将返回Closure.DELEGATE_FIRST
。调试jar,结果将是0
,以便由于错误的解析策略而稍后抛出MissingMethodException
。
目前我还不知道如何解决这个问题。
此行为的原因是/可能是什么? 我该怎么解决这个问题?
我将Grails 3.3.8与Java OpenJDK 1.8.0_192一起使用。
答案 0 :(得分:1)
如果不需要支持JDK 7,则可以升级到Groovy Spreadsheet Builder 2.0.0.RC1,它仅与JDK 8兼容,但似乎可以解决问题。
答案 1 :(得分:0)
@ClosureParams
和@DelegatesTo
适用于groovy.lang.Closure
类型的参数。在这种情况下,您已将其应用于Configurer<WorkbookDefinition>
。