Отсутствие resolStrategy разрывает DSL при выполнении из исполняемого файла jar - PullRequest
0 голосов
/ 11 января 2019

Я использую Groovy Spreadsheet Builder в одном из моих проектов Grails для экспорта некоторых данных в файл Excel.

Все прекрасно работает, пока я не создаю работающую флягу (используя 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)

Интерфейс (Java) SpreadsheetBuilder выглядит следующим образом:

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);
}

При отладке выполнения кода и фляги я обнаружил разницу при переходе по invokeMethod() из ClosureMetaClass.

Когда closure.getResolveStrategy(); в рабочей версии вызывается, Closure.DELEGATE_FIRST будет возвращено. Отладка банки приведет к 0, поэтому MissingMethodException будет брошено позже из-за неправильной стратегии разрешения.

Пока я понятия не имею, как решить эту проблему.

В чем / может быть причина такого поведения? Что я могу сделать, чтобы решить эту проблему?

Я использую Grails 3.3.8 с Java OpenJDK 1.8.0_192.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Если вам не нужна поддержка JDK 7, вы можете перейти на Groovy Spreadsheet Builder 2.0.0.RC1, который совместим только с JDK 8, но, похоже, решает проблему.

0 голосов
/ 12 января 2019

@ClosureParams и @DelegatesTo применимы к параметрам типа groovy.lang.Closure. В этом случае вы применили его к Configurer<WorkbookDefinition>.

...