从可运行的jar执行时,缺少resolveStrategy会中断DSL



我在我的一个Grails项目中使用Groovy电子表格生成器将一些数据导出为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的执行过程中,我在遍历ClosureMetaClassinvokeMethod()时发现了差异。

当工作版本中的closure.getResolveStrategy();被调用时,会返回Closure.DELEGATE_FIRST。调试jar,结果将是0,因此MissingMethodException稍后将由于错误的解析策略而被抛出。

现在我不知道如何解决这个问题。

这种行为的原因是什么?我能做些什么来解决这个问题?

我将Grails 3.3.8与Java OpenJDK 1.8.0_192结合使用。

如果您不需要支持JDK 7,您可以升级到Groovy Spreadsheet Builder 2.0.0.RC1,它仅与JDK 8兼容,但似乎可以解决问题。

@ClosureParams@DelegatesTo适用于groovy.lang.Closure类型的参数。在本例中,您已将其应用于Configurer<WorkbookDefinition>

相关内容

  • 没有找到相关文章

最新更新