Запуск образца afBedSheet приводит к ошибке "Служба не существует для типа" afIocConfig::FactoryDefaults ""

Я пытаюсь создать новое веб-приложение на языке программирования Fantom с использованием инфраструктуры afBedSheet, но не могу запустить самый простой пример.

Код является:

using afBedSheet
using afIoc

class AppModule {
  @Contribute
  static Void contributeRoutes(OrderedConfig conf) {
    conf.add(Route(`/hello/**`, HelloPage#hello))
  }
}

class HelloPage {
  Text hello(Str name, Int iq := 666) {
    return Text.fromPlain("Hello! I'm $name and I have an IQ of $iq!")
  }
}

И мой build.fan выглядит так:

using build

class Build : BuildPod {

    new make() {
        podName    = "mt"
        summary    = "TODO write a description here"
        depends    = ["sys 1.0+", "afBedSheet 1.0.16+", "afIoc 1.4.6+"]
        srcDirs    = [`fan/`, `test/`]
    }
}

Когда я запускаю команду...

fan afBedSheet mt::AppModule 12345

... это ошибка, которую я получаю:

C: \ dev \ mt2 \ fan> fan afBedSheet mt:: AppModule 12345
[08:49:36 02.11.11] [info] [afBedSheet] Запуск простыни WebApp 'mt::AppModule' на порту 12345
[08:49:36 02-Nov-13] [info] [web] WispService запущен на порту 12345
[08:49:36 02-Nov-13] [info] [afBedSheet] Найден мод 'mt:: AppModule'
[08:49:36 02.11.11] [info] [afIoc] Добавление определения модуля для mt:: AppModule
[08:49:36 02-Nov-13] [info] [afIoc] Добавление определения модуля для afBedSheet::BedSheetModule
afIoc::IocErr: Служба не существует для типа "afIocConfig::FactoryDefaults", определенного в методе ввода afBedSheet::BedSheetModule.contributeFactoryDefaults.
Ioc Operation Trace:
  [ 1] Создание реестра IoC
  [ 2] Утверждение определений вклада
Трассировки стека:
        на fan.afIoc.IocErr.make(Errs.fan:15)
        на fan.afIoc.Utils.stackTraceFilter(Utils.fan:63)
        в fan.afIoc.RegistryBuilder.build(RegistryBuilder.fan:112)
        at fan.afBedSheet.BedSheetWebMod.onStart(BedSheetWebMod.fan:119)
        на fan.wisp.WispService.onStart(WispService.fan:72)
        at fan.sys.Service$.start(Служба $.java:205)
        на fan.wisp.WispService.start(WispService.fan:21)
        на fan.afBedSheet.Main$startServices$3.doCall(Main.fan:54)
        на fan.afBedSheet.Main$startServices$3.call(Main.fan:54)
        at fan.sys.List.each(List.java:555)
        на fan.afBedSheet.Main.startServices(Main.fan:54)
        at fan.afBedSheet.Main.run(Main.fan:48)
        at fan.util.AbstractMain.main(AbstractMain.fan:370)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод)
        at sun.reflect.NativeMethodAccessorImpl.invoke(неизвестный источник)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестный источник)
        в java.lang.reflect.Method.invoke(Неизвестный источник)
        at fan.sys.Method.invoke(Method.java:559)
        at fan.sys.Method$MethodFunc.callOn(Method.java:230)
        at fan.sys.Method.callOn(Method.java:139)
        на fanx.tools.Fan.callMain(Fan.java:175)
        в fanx.tools.Fan.executeType(Fan.java:140)
        на fanx.tools.Fan.execute(Fan.java:41)
        на fanx.tools.Fan.run(Fan.java:298)
        в fanx.tools.Fan.main(Fan.java:336)

Что мне здесь не хватает?

1 ответ

Решение

Ах, кажется, модуль IocConfig не добавляется как транзитивная зависимость, следовательно Service does not exist for Type 'afIocConfig::FactoryDefaults',

Самое быстрое решение - добавить следующее к вашему build.fan:

depends = ["sys 1.0+", "afBedSheet 1.0.16+", "afIoc 1.4.6+", "afIocConfig 0+"]
meta    = ["afIoc.module" : "mt::AppModule"]

То есть добавить afIocConfig в качестве зависимости и определите свой AppModule как мета-модуль. Затем запустите простыню только с именем модуля:

fan afBedSheet mt 12345

Это проблема v1.0.16, когда afIocConfig был разделен на собственный модуль - тесты пройдены, потому что afBedSheet сам по себе зависит от afIocConfig. d'Oh!

Это должно быть исправлено в afBedSheet v1.1.0.

Другие вопросы по тегам