Конфигурация интерфейса DeltaSpike не может быть внедрена

Я следую документации DeltaSpike, чтобы создать внедряемый интерфейс, который связывает свойства конфигурации. .

@Configuration(prefix = "application.")
public interface AppConfig {

    @ConfigProperty(name = "name", evaluateVariables = false)
    String getApplicationName();
}

Я пытался использовать его как через BeanProvider#getContextualReference и с @Inject.

@Inject
public Framework(final AppContext context, final BeanManager beanManager, AppConfig app) {
    this.appContext = context;
    this.beanManager = beanManager;
    logger.info("Initialization application with name {}.", app.getApplicationName());
}
Exception in thread "main" org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type AppConfig with qualifiers @Default

Я также получаю предупреждение:
Unsatisfied dependency: no bean matches the injection point

Я пробовал возиться с файлом beans.xml и зависимостями в build.gradle, но безрезультатно, и я не уверен, что я делаю неправильно по сравнению с документацией.

Может ли кто-нибудь попытаться указать мне правильное направление?


person Seth Falco    schedule 28.04.2020    source источник


Ответы (1)


Проблема была не в DeltaSpike, а скорее в Weld, реализации CDI, от которой зависит проект.

Проблема вызвана тем, что Gradle создает main и resource отдельно, поэтому сначала необходимо изменить вывод ресурса, чтобы собрать их вместе. Это устанавливает вывод ресурса в каталог классов.

sourceSets {
    main {
        output.resourcesDir = output.classesDirs.singleFile
    }

    test {
        output.resourcesDir = output.classesDirs.singleFile
    }
}

Затем запустите приложение с помощью Gradle вместо IDE, для этого добавьте и настройте плагин application. Это создаст задачу Gradle с именем run.

plugins {
    id "application"
    id "java"
    id "io.spring.dependency-management" version "1.0.9.RELEASE"
}

application {
    mainClassName = "org.example.app.Main"
}

Если кто-то использует аннотации DeltaSpike, ему может потребоваться изменить beans.xml, чтобы найти all, а не annotated.

Дополнительная информация:
https://discuss.gradle.org/t/application-plugin-run-task-should-first-consolidate-classes-and-resources-folder-or-depend-on-installapp-or-stuff-like-weld-se-wont-work/1248

Репозиторий, содержащий минимальный проект DeltaSpike/Weld/Gradle:
https://gitlab.com/SethFalco/mini-deltaspike

person Seth Falco    schedule 28.04.2020